在C#开发过程中,将HTML内容转换为PDF文件是较为常见的需求,无论是生成业务报表、导出网页内容还是保存格式化文档,都需要用到这项技术。不同的实现方案在转换效果、性能、兼容性上各有差异,开发者可以根据实际需求选择合适的工具。

常用HTML转PDF方案对比
目前C#实现HTML转PDF的主流方案主要有三类,不同方案的特点如下表所示:
| 方案名称 | 核心依赖 | 优点 | 缺点 |
|---|---|---|---|
| iTextSharp + XMLWorker | iTextSharp库 | 开源免费,支持自定义样式,转换精度较高 | 对复杂CSS支持有限,配置相对繁琐 |
| WkHtmlToPdf | WkHtmlToPdf工具 | 支持现代CSS,转换效果接近浏览器渲染 | 需要额外安装工具,部署时依赖外部程序 |
| 第三方商业库 | Spire.PDF等 | 功能全面,兼容性好,使用简单 | 商业使用需要付费,免费版有功能限制 |
基于iTextSharp的实现步骤
1. 环境准备
首先需要安装iTextSharp库,可以通过NuGet包管理器搜索iTextSharp进行安装,也可以手动下载对应版本的dll文件添加到项目引用中。本文使用的是iTextSharp 5.5.13版本,安装完成后即可在代码中调用相关API。
2. 基础转换代码实现
核心逻辑是先解析HTML内容,再将解析后的元素添加到PDF文档中,以下是完整的实现代码:
using System;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;
using iTextSharp.tool.xml.pipeline;
using iTextSharp.tool.xml.html;
using iTextSharp.tool.xml.css;
using iTextSharp.tool.xml.parser;
namespace HtmlToPdfDemo
{
public class HtmlToPdfHelper
{
/// <summary>
/// 将HTML字符串转换为PDF文件
/// </summary>
/// <param name="htmlContent">HTML内容字符串</param>
/// <param name="outputPath">PDF输出路径</param>
public static void ConvertHtmlToPdf(string htmlContent, string outputPath)
{
// 初始化PDF文档对象,设置页面大小为A4
Document document = new Document(PageSize.A4);
try
{
// 创建PDF写入器,关联到输出文件流
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outputPath, FileMode.Create));
document.Open();
// 配置HTML解析器,支持中文需要添加字体
FontFactory.Register(System.AppDomain.CurrentDomain.BaseDirectory + "fonts/simsun.ttc", "SimSun");
FontFactory.Register(System.AppDomain.CurrentDomain.BaseDirectory + "fonts/simhei.ttf", "SimHei");
// 创建XMLWorker实例,用于将HTML转换为PDF元素
XMLWorkerHelper worker = XMLWorkerHelper.GetInstance();
// 解析HTML内容并写入PDF
using (StringReader sr = new StringReader(htmlContent))
{
worker.ParseXHtml(writer, document, sr, null, Encoding.UTF8, new FontProvider());
}
}
catch (Exception ex)
{
throw new Exception("HTML转PDF失败:" + ex.Message);
}
finally
{
// 关闭文档释放资源
if (document.IsOpen())
{
document.Close();
}
}
}
}
/// <summary>
/// 自定义字体提供器,解决中文显示问题
/// </summary>
public class FontProvider : IFontProvider
{
public bool IsRegistered(string fontName)
{
return true;
}
public Font GetFont(string fontName, string encoding, bool embedded, float size, int style, BaseColor color)
{
// 优先使用注册的字体,没有则使用默认字体
if (FontFactory.IsRegistered(fontName))
{
return FontFactory.GetFont(fontName, encoding, embedded, size, style, color);
}
// 默认使用宋体显示中文
return FontFactory.GetFont("SimSun", BaseFont.IDENTITY_H, BaseFont.EMBEDDED, size, style, color);
}
}
}
3. 调用示例
使用上述工具类转换HTML的代码如下:
using System;
namespace HtmlToPdfDemo
{
class Program
{
static void Main(string[] args)
{
// 待转换的HTML内容
string html = @"
<html>
<head>
<style>
.title { font-size: 24px; font-weight: bold; text-align: center; }
.content { font-size: 14px; line-height: 24px; margin: 20px; }
</style>
</head>
<body>
<div class='title'>HTML转PDF测试</div>
<div class='content'>
这是一段测试内容,用于验证C#将HTML转换为PDF的功能是否正常。
支持中文显示,支持基础CSS样式,转换后的PDF可以正常查看。
</div>
</body>
</html>
";
// 输出路径
string outputPath = "test.pdf";
try
{
HtmlToPdfHelper.ConvertHtmlToPdf(html, outputPath);
Console.WriteLine("PDF生成成功,路径:" + outputPath);
}
catch (Exception ex)
{
Console.WriteLine("生成失败:" + ex.Message);
}
}
}
}
注意事项
- 中文显示需要提前注册对应的中文字体,否则会出现乱码或者内容缺失的情况,字体文件需要放在项目可访问的路径下。
- iTextSharp的XMLWorker对CSS的支持有限,复杂的选择器、flex布局等现代CSS特性可能无法正常渲染,建议转换前简化HTML的样式。
- 如果HTML中包含图片,需要保证图片路径正确,或者使用绝对路径,否则图片可能无法正常显示到PDF中。
- 生成的PDF文件如果内容过多,会自动分页,不需要额外处理分页逻辑。
常见问题处理
问题1:转换后中文显示乱码
原因是没有注册中文字体,需要按照上述代码中的方式,将宋体、黑体等常用中文字体注册到FontFactory中,并且在HTML的样式中指定对应的字体名称。
问题2:CSS样式不生效
首先检查CSS语法是否正确,然后确认使用的CSS属性是否在XMLWorker的支持范围内,不支持的属性可以替换为支持的样式实现相同效果。
问题3:图片无法显示
如果是本地图片,使用绝对路径;如果是网络图片,需要确保网络可访问,也可以在代码中将网络图片下载到本地后使用本地路径。
C#HTML_to_PDFPDF_conversioniTextSharp修改时间:2026-07-07 08:06:14