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

如何用iTextSharp实现长图片PDF跨页?兼询截图分辨率优化方案

嘿,我来帮你搞定这两个头疼的问题!

一、用iTextSharp实现长图片自动分页到PDF

你遇到的核心问题是iTextSharp默认不会自动拆分长图片,得我们手动计算分页逻辑,把长图切割成适配单页PDF的小块再逐个添加。具体步骤和代码如下:

  1. 核心思路:

    • 先获取图片的实际缩放后尺寸,对比PDF页面的可绘制高度(记得留边距哦)
    • 计算需要拆分的总页数(向上取整避免漏内容)
    • 逐页截取图片的对应区域,添加到新的PDF页面中
  2. 实现代码:

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,这就是截图模糊的关键原因!我们可以通过两个关键点提升清晰度:

  1. 提升DPI参数:把RenderTargetBitmap的DPI设置成300(印刷级标准)或者更高
  2. 适配系统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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:18:29