如何用iTextSharp实现长图片PDF跨页?兼询截图分辨率优化方案
嘿,我来帮你搞定这两个头疼的问题!
一、用iTextSharp实现长图片自动分页到PDF
你遇到的核心问题是iTextSharp默认不会自动拆分长图片,得我们手动计算分页逻辑,把长图切割成适配单页PDF的小块再逐个添加。具体步骤和代码如下:
核心思路:
- 先获取图片的实际缩放后尺寸,对比PDF页面的可绘制高度(记得留边距哦)
- 计算需要拆分的总页数(向上取整避免漏内容)
- 逐页截取图片的对应区域,添加到新的PDF页面中
实现代码:
using iTextSharp.text; using iTextSharp.text.pdf; using System.IO; using System; string imageFileName = "ScreenCapture.png"; string pdfFileName = "PurchaseOrder.pdf"; // 读取目标图片 var fullImage = iTextSharp.text.Image.GetInstance(imageFileName); // 先让图片适配PDF页面宽度,同时保持比例 fullImage.ScaleToFit(PageSize.A4.Width - 20, float.MaxValue); // 左右各留10单位边距 float pageUsableHeight = PageSize.A4.Height - 20; // 上下各留10单位边距 float totalImageHeight = fullImage.ScaledHeight; // 计算需要的总页数,向上取整避免最后一页内容被截断 int totalPages = (int)Math.Ceiling(totalImageHeight / pageUsableHeight); // 生成PDF using (var pdfStream = new FileStream(pdfFileName, FileMode.Create)) { var document = new Document(PageSize.A4); PdfWriter.GetInstance(document, pdfStream); document.Open(); for (int pageIndex = 0; pageIndex < totalPages; pageIndex++) { document.NewPage(); // 复制原图片,避免修改原对象影响后续分页 var pageImage = new iTextSharp.text.Image(fullImage); pageImage.ScaleToFit(PageSize.A4.Width - 20, totalImageHeight); // 计算当前页要显示的图片区域 float cropTop = totalImageHeight - (pageIndex + 1) * pageUsableHeight; float cropBottom = totalImageHeight - pageIndex * pageUsableHeight; // 设置裁剪区域,只保留当前页需要显示的部分 pageImage.CropRectangle = new Rectangle(0, cropTop, pageImage.ScaledWidth, cropBottom); // 设置图片在PDF页面的位置(和边距对应) pageImage.SetAbsolutePosition(10, 10); document.Add(pageImage); } document.Close(); }
二、优化截图分辨率的方法
你用的WPF RenderTargetBitmap 默认DPI是96,这就是截图模糊的关键原因!我们可以通过两个关键点提升清晰度:
- 提升DPI参数:把RenderTargetBitmap的DPI设置成300(印刷级标准)或者更高
- 适配系统DPI缩放:根据当前窗口的DPI缩放因子计算实际像素尺寸,避免高分屏上的模糊
修改后的截图代码示例:
using System.Windows; using System.Windows.Media; using System.Windows.Media.Imaging; using System.IO; string imageFileName = "ScreenCapture.png"; var targetWindow = Application.Current.MainWindow; // 替换成你要截图的目标窗口 // 获取系统DPI缩放因子,适配高分屏 DpiScale dpiScale = VisualTreeHelper.GetDpi(targetWindow); int captureWidth = (int)(targetWindow.ActualWidth * dpiScale.DpiScaleX); int captureHeight = (int)(targetWindow.ActualHeight * dpiScale.DpiScaleY); // 创建高分辨率渲染目标 RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap( captureWidth, captureHeight, 300, // X方向DPI 300, // Y方向DPI PixelFormats.Pbgra32 // 高质量无损像素格式 ); // 渲染目标窗口内容 renderTargetBitmap.Render(targetWindow); // 保存为PNG(无损格式,更适合保留截图细节) using (var fileStream = new FileStream(imageFileName, FileMode.Create)) { PngBitmapEncoder encoder = new PngBitmapEncoder(); encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap)); encoder.Save(fileStream); }
这样调整后,截图的清晰度会有明显提升,再配合上面的iTextSharp分页逻辑,就能完美生成多页PDF啦!
内容的提问来源于stack exchange,提问作者Ivan Apungan
相关产品推荐
相关产品推荐

