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

使用PDFsharp合并多页TIFF为PDF时第二份TIFF页面全空白求助

解决多页TIFF合并为PDF时第二份TIFF页面空白的问题

你遇到的问题主要是两处代码逻辑错误导致的,我来帮你拆解并修正:

问题原因分析

  1. 错误的PDF页面索引引用:处理每个TIFF的页面时,你用doc.Pages[PageIndex]获取要绘制的页面,但PageIndex是当前TIFF文件内部的页码(从0重新开始)。处理第二个TIFF时,这个索引会指向第一个TIFF已经创建的PDF页面,而刚添加的、对应第二个TIFF内容的新PDF页面根本没有被绘制,所以显示空白。
  2. 多余的空白页添加:每个TIFF处理完成后调用的doc.AddPage()会额外插入一个空白页,这不仅会增加不必要的页数,还可能干扰页面索引逻辑。

修正后的代码

private static void MergeTiffToPDF(string filePathWithFileName)
{
    // 提取Zip解压后的文件夹路径
    string extractFolder = filePathWithFileName.Substring(0, filePathWithFileName.LastIndexOf('.'));
    // 获取文件夹内的所有TIFF文件
    string[] tiffFiles = Directory.GetFiles(extractFolder);
    string destination = "C:\\Users\\someuser\\Desktop\\PDF_TIF_Document.pdf";

    // 使用using自动释放PdfDocument资源
    using (PdfDocument doc = new PdfDocument())
    {
        foreach (string tiffPath in tiffFiles)
        {
            // 使用using自动释放Image资源
            using (Image tiffImage = Image.FromFile(tiffPath))
            {
                int totalTiffPages = tiffImage.GetFrameCount(FrameDimension.Page);
                for (int pageIndex = 0; pageIndex < totalTiffPages; pageIndex++)
                {
                    tiffImage.SelectActiveFrame(FrameDimension.Page, pageIndex);
                    // 使用using自动释放XImage资源
                    using (XImage img = XImage.FromGdiPlusImage(tiffImage))
                    {
                        PdfPage pdfPage = new PdfPage();
                        // 根据图像尺寸设置页面方向
                        pdfPage.Orientation = img.PixelWidth > img.PixelHeight 
                            ? PageOrientation.Landscape 
                            : PageOrientation.Portrait;
                        // 将新页面添加到PDF文档
                        doc.Pages.Add(pdfPage);

                        // 获取刚添加的最后一页(正确的目标页面)来绘制内容
                        using (XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[doc.Pages.Count - 1]))
                        {
                            // 可选:如果需要让图像适配PDF页面大小,用下面的DrawImage重载
                            // xgr.DrawImage(img, new XRect(0, 0, pdfPage.Width, pdfPage.Height), 
                            //     XUnit.FromPixels(img.PixelWidth), XUnit.FromPixels(img.PixelHeight), 
                            //     XGraphicsUnit.Pixel);
                            xgr.DrawImage(img, 0, 0);
                        }
                    }
                }
            }
            // 移除原代码中多余的doc.AddPage()调用
        }
        // 保存并自动关闭文档(using会处理关闭)
        doc.Save(destination);
    }
}

关键修改点说明

  • 正确获取目标PDF页面:用doc.Pages.Count - 1获取刚添加的最后一页,确保每个TIFF页面都绘制到对应的新PDF页面上,不会覆盖之前的内容。
  • 移除多余的空白页:删掉了每个TIFF循环后的doc.AddPage(),避免额外空白页。
  • 添加资源自动释放:对所有实现IDisposable的对象(PdfDocument、Image、XImage、XGraphics)使用using语句,确保资源被及时释放,避免内存泄漏。
  • 优化变量命名:把模糊的变量名改成更清晰的名称,提升代码可读性。

额外优化建议

如果你的TIFF文件有不同的DPI或者尺寸,直接按像素绘制可能导致内容在PDF页面上显示不全或比例失调。可以使用代码中注释的DrawImage重载方法,让图像适配PDF页面大小。

内容的提问来源于stack exchange,提问作者WorksOnMyLocal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:59:26