You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在C#或Java中无需读取字体数据即可生成指定字体的PDF?

可以实现:仅指定字体名称生成非嵌入字体的PDF

无论是C#还是Java,都有支持仅通过字体名称指定字体、不嵌入字体文件的PDF生成库,核心是让PDF文件仅记录字体名称,依赖打开文件的用户本地安装对应字体来渲染。以下是具体实现方案:

C# 实现方案

使用 iText 7

iText 7 支持直接通过字体名称创建非嵌入字体,无需读取字体文件:

using iText.Kernel.Font;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;

// 创建PDF文档
PdfWriter writer = new PdfWriter("output.pdf");
PdfDocument pdf = new PdfDocument(writer);
Document document = new Document(pdf);

// 指定字体名称,设置不嵌入字体
PdfFont customFont = PdfFontFactory.CreateFont("微软雅黑", PdfEncodings.IDENTITY_H, false);

// 添加文本内容
document.Add(new Paragraph("这是使用指定字体的文本").SetFont(customFont).SetFontSize(12));

document.Close();
  • 第三个参数false表示不嵌入字体,PDF仅会记录"微软雅黑"这个字体名称;
  • 若用户本地未安装该字体,PDF阅读器会用默认字体替代渲染。

关于 PdfSharp 的补充

你遇到的异常可能是因为默认使用了需要嵌入的模式,PdfSharp 其实也支持指定系统字体名称(需确保字体在系统中存在),示例:

using PdfSharp.Drawing;
using PdfSharp.Pdf;

PdfDocument document = new PdfDocument();
PdfPage page = document.AddPage();
XGraphics gfx = XGraphics.FromPdfPage(page);

// 直接指定系统字体名称
XFont font = new XFont("Arial", 12, XFontStyle.Regular);
gfx.DrawString("测试文本", font, XBrushes.Black, new XPoint(10, 10));

document.Save("output.pdf");

注意:部分特殊字体可能因PdfSharp的字体映射问题报错,优先推荐iText 7。

Java 实现方案

使用 iText 7(Java版)

和C#版逻辑一致,通过字体名称创建非嵌入字体:

import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;

public class PdfGenerator {
    public static void main(String[] args) throws Exception {
        PdfWriter writer = new PdfWriter("output.pdf");
        PdfDocument pdf = new PdfDocument(writer);
        Document document = new Document(pdf);

        // 指定字体名称,不嵌入
        PdfFont customFont = PdfFontFactory.createFont("微软雅黑", PdfEncodings.IDENTITY_H, false);

        document.add(new Paragraph("这是使用指定字体的文本").setFont(customFont).setFontSize(12));

        document.close();
    }
}

使用 Apache PDFBox

Apache PDFBox 也支持通过字体名称引用系统字体,无需加载字体文件:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.font.PDType0Font;

public class PdfBoxExample {
    public static void main(String[] args) throws Exception {
        try (PDDocument document = new PDDocument()) {
            PDPage page = new PDPage();
            document.addPage(page);

            try (PDPageContentStream contentStream = new PDPageContentStream(document, page)) {
                // 通过字体名称创建非嵌入字体
                PDType0Font font = PDType0Font.load(document, null, "Arial", false);
                
                contentStream.beginText();
                contentStream.setFont(font, 12);
                contentStream.newLineAtOffset(10, 700);
                contentStream.showText("测试文本");
                contentStream.endText();
            }

            document.save("output.pdf");
        }
    }
}

关键说明

  • 所有方案的核心是不嵌入字体,因此PDF文件体积更小,但必须依赖用户本地安装对应字体才能正确显示;
  • 若指定的字体名称在用户系统中不存在,PDF阅读器会自动替换为默认字体(通常是宋体、Arial等)。

内容的提问来源于stack exchange,提问作者zhoudu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 15:27:23