C#生成PDF文件 C#如何通过代码创建PDF文档

来源:这里教程网 时间:2026-02-21 17:42:48 作者:

直接用

System.Drawing
或原生 .NET 类库无法生成符合规范的 PDF 文件——PDF 是二进制结构复杂的格式,必须依赖专门的 PDF 库。

为什么不能用
Graphics
直接画到文件上

.NET 的

Graphics
类支持绘图到位图、屏幕或打印机,但不支持输出为 PDF 流。强行把
Metafile
转成 PDF 会丢失字体嵌入、矢量精度、书签、超链接等关键特性,且多数 PDF 阅读器会报错或显示异常。

Graphics
绘制的
Metafile
导出为 PDF 属于“伪 PDF”,实际是封装了 WMF 的容器,Adobe Acrobat 拒绝打开
没有对象交叉引用表(xref)、未压缩的流、缺失 trailer,不符合 PDF 规范 ISO 32000 中文等非 ASCII 字符极易乱码,因无字体子集嵌入机制

推荐方案:用
iTextSharp
(v5)或
iText7

iTextSharp
(.NET Framework 4.x 常用)和
iText7
(.NET Core/5+ 推荐)是成熟、文档全、可商用(注意 v7 商业许可条款)的 PDF 生成库。它们提供底层对象模型和高层语义 API,能精准控制页面、字体、表格、签名等。

写入中文需显式注册 TrueType 字体:
BaseFont.CreateFont("simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED)
iText7
中使用
PdfFontFactory.CreateFont
并传入
FontProgramFactory.CreateFont
加载本地字体文件
避免用
Document.Add(new Paragraph("中文"))
直接写入——若未指定字体,会触发默认 Helvetica,导致方块
表格列宽设为
new float[] { 200f, 150f }
比设为百分比更稳定,尤其跨页时

最小可行代码示例(
iText7
+ .NET 6)

using iText.Kernel.Pdf;
using iText.Layout.Document;
using iText.Layout.Element;
using iText.IO.Font.Constants;
// 创建 PDF writer 和 document
using var writer = new PdfWriter("output.pdf");
using var pdf = new PdfDocument(writer);
var doc = new Document(pdf);
// 注册中文字体(确保 simsun.ttc 在项目目录)
var font = PdfFontFactory.CreateFont(@"simsun.ttc", Identity.H, true);
doc.SetFont(font).SetFontSize(12);
doc.Add(new Paragraph("Hello World!你好世界"));
doc.Add(new AreaBreak()); // 分页符
doc.Add(new Table(2).AddCell("姓名").AddCell("年龄")
                    .AddCell("张三").AddCell("28"));
doc.Close();

注意:

simsun.ttc
必须是完整路径或位于运行目录;
Identity.H
表示水平书写、Unicode 编码;
true
表示嵌入字体子集(否则中文不显示)。

最容易被忽略的是字体嵌入和编码设置——90% 的“PDF 中文乱码”问题都源于此,而不是库选错或语法错误。

相关推荐