iTextSharp/iText7是稳定跨平台的图片转PDF方案,需用内存图像而非文件路径加载,按原图DPI动态设页面尺寸,.NET Core+须用iText7并注意API重构与包依赖。
用 iTextSharp 合成多张图片为 PDF 最直接
不是所有 pdf 库都适合纯图片转 pdf,itextsharp(.net framework)或 itext7(.net core/5+)是稳定、可控、不依赖系统组件的选择。它不调 windows api,也不需要 adobe 软件,生成结果跨平台一致。
常见错误是直接用 Image.GetInstance() 加载本地路径字符串——这会抛 IOException: Cannot read file,因为 iText 需要的是字节流或 System.Drawing.Image 对象,不是路径本身。
- 先用
System.Drawing.Image.FromFile()或Image.FromStream()加载图片到内存 - 再用
iTextSharp.text.Image.GetInstance(bitmap, ImageFormat.Png)转成 iText 可用的Image - 每张图单独加一页,避免缩放失真:调用
document.NewPage()显式分页
PDF 页面尺寸必须匹配图片宽高比,否则留白或裁切
iText 默认 A4(595×842 点),但手机截图可能是 1080×1920,直接插入会拉伸或居中留大片白边。关键不是“适配页面”,而是“按图定页”。
正确做法是动态计算每页尺寸:用图片原始像素宽高 ÷ DPI(常用 96 或 72)换算为 PDF 点(point)。例如 1080×1920 PNG 在 96 DPI 下,对应页面宽 1080 / 96f * 72 ≈ 810 点,高 1920 / 96f * 72 ≈ 1440 点。
- 创建
Document时传入自定义Rectangle,而非用预设常量如PageSize.A4 - 插入前调用
image.ScaleAbsolute()强制设为页面宽高,防止自动缩放 - 若图片方向不一(有横图有竖图),每页需单独重设
Document.SetPageSize()
在 .NET 6+ 中优先选 iText7,但 NuGet 包名和命名空间全变了
iTextSharp 不支持 .NET Core 及以后版本,强行引用会报 Could not load file or assembly 'System.Drawing.Common'。iText7 是官方继任者,但 API 完全重构,老代码不能直接迁移。
安装命令是 dotnet add package itext7,不是 iTextSharp;核心命名空间从 iTextSharp.text 变成 iText.Kernel.Pdf 和 iText.Layout.Element。
- 加载图片改用
ImageDataFactory.Create(byte[])或ImageDataFactory.Create(string path) - 添加图片不再是
document.Add(image),而是new Image(imageData).SetAutoScale(true)再加进Div或直接pdfCanvas.AddXObjectAt() - 务必引用
itext7.kernel、itext7.layout、itext7.io三个基础包,缺一不可
别忽略图片编码格式和透明通道问题
PNG 带 Alpha 通道时,iText7 默认会保留透明背景,但 PDF 查看器渲染可能显示为黑底;JPEG 若含 ICC 配置文件,某些版本 iText 会解析失败并抛 BadElementException: Invalid image format。
稳妥做法是统一转为无透明、无色彩配置的 Bitmap 再输入:
- 用
new Bitmap(original)强制解码一次,剥离元数据 - 对 PNG,创建新
Bitmap并用Graphics.Clear(Color.White)填白底 - 避免用
Image.FromStream(stream, true, false)的第三个参数(useEmbeddedColorManagement),设为false
合成 PDF 的难点不在拼接逻辑,而在于每张图的加载方式、DPI 意识、以及 .NET 版本与库的隐式耦合。漏掉任意一环,都可能表现为 PDF 打不开、图片错位、或者某张图死活不显示。










