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

将iTextSharp 5.5的PDF镜像翻转及添加黑框功能迁移至iText 8.0.1的技术求助

将iTextSharp 5.5的PDF镜像翻转及添加黑框功能迁移至iText 8.0.1的技术求助

我来帮你排查问题并修正代码!你当前的迁移代码里,镜像翻转不生效的核心原因是你先直接复制了原页面内容,之后的矩阵变换根本不会影响已经存在的页面内容——CopyPagesTo会把源页面的完整内容直接拷贝到新页面,而ConcatMatrix只对之后在画布上绘制的内容生效,对已经复制的内容没作用。

接下来给你梳理正确的实现思路,以及修正后的完整代码:

核心问题分析

  1. iText 8的文档处理逻辑和iTextSharp 5有较大差异,不再依赖Document类,而是直接通过PdfDocument和PdfCanvas来操作页面内容
  2. 镜像翻转需要在导入源页面内容到目标页面时就应用变换矩阵,而不是复制页面后再做变换
  3. 你画框时误用了SetFillColor,应该用SetStrokeColor(和原iTextSharp的SetColorStroke对应),否则描边颜色不会生效

修正后的完整代码

using iText.Kernel.Colors;
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Xobject;
using System.IO;

public static void FlipPDF(string input, string output, bool mirror, bool addFrame)
{
    try
    {
        // 打开源PDF文档
        using (PdfReader reader = new PdfReader(input))
        using (PdfDocument sourceDoc = new PdfDocument(reader))
        {
            // 创建目标PDF文档
            using (FileStream fs = new FileStream(output, FileMode.Create))
            using (PdfWriter writer = new PdfWriter(fs).SetSmartMode(true))
            using (PdfDocument destDoc = new PdfDocument(writer))
            {
                // 遍历源文档的每一页
                for (int pageNum = 1; pageNum <= sourceDoc.GetNumberOfPages(); pageNum++)
                {
                    PdfPage sourcePage = sourceDoc.GetPage(pageNum);
                    PageSize pageSize = sourcePage.GetPageSizeWithRotation();

                    // 在目标文档中创建新页面,尺寸和源页面一致
                    PdfPage destPage = destDoc.AddNewPage(pageSize);
                    PdfCanvas canvas = new PdfCanvas(destPage);

                    // 将源页面转换为XObject,用于导入内容
                    PdfFormXObject pageXObject = sourcePage.CopyAsFormXObject(destDoc);

                    if (mirror)
                    {
                        // 应用镜像变换:先水平翻转,再平移修正位置
                        canvas.SaveState();
                        AffineTransform transform = AffineTransform.GetScaleInstance(-1, 1);
                        transform.Translate(-pageSize.GetWidth(), 0);
                        canvas.ConcatMatrix(transform);
                        // 导入并添加源页面内容(此时会应用上述变换)
                        canvas.AddXObject(pageXObject, 0, 0);
                        canvas.RestoreState();
                    }
                    else
                    {
                        // 直接添加源页面内容,无变换
                        canvas.AddXObject(pageXObject, 0, 0);
                    }

                    if (addFrame)
                    {
                        // 添加黑色边框:注意用SetStrokeColor而不是SetFillColor
                        canvas.SaveState();
                        canvas.SetLineWidth(10);
                        canvas.SetStrokeColor(ColorConstants.BLACK);
                        // 绘制矩形框(参数:x, y, width, height)
                        canvas.Rectangle(208, 30, 180, pageSize.GetHeight() - 51);
                        canvas.Stroke();
                        canvas.RestoreState();
                    }
                }
            }
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine($"处理出错:{ex.Message}");
    }
}

关键代码说明

  1. 页面内容导入方式:用CopyAsFormXObject把源页面转换成可复用的XObject,这样可以通过矩阵变换控制它的绘制方式,这是iText 8中处理页面内容变换的标准方式
  2. 镜像变换时机:在AddXObject之前调用ConcatMatrix,这样变换会直接作用于导入的页面内容
  3. 边框绘制修正:把SetFillColor改为SetStrokeColor,确保黑色是用于描边(而不是填充矩形内部),和原iTextSharp的逻辑保持一致
  4. 文档资源管理:严格使用using块管理所有PDF相关对象,确保资源正确释放

备注:内容来源于stack exchange,提问作者DiGi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.21 11:29:32