将iTextSharp 5.5的PDF镜像翻转及添加黑框功能迁移至iText 8.0.1的技术求助
将iTextSharp 5.5的PDF镜像翻转及添加黑框功能迁移至iText 8.0.1的技术求助
我来帮你排查问题并修正代码!你当前的迁移代码里,镜像翻转不生效的核心原因是你先直接复制了原页面内容,之后的矩阵变换根本不会影响已经存在的页面内容——CopyPagesTo会把源页面的完整内容直接拷贝到新页面,而ConcatMatrix只对之后在画布上绘制的内容生效,对已经复制的内容没作用。
接下来给你梳理正确的实现思路,以及修正后的完整代码:
核心问题分析
- iText 8的文档处理逻辑和iTextSharp 5有较大差异,不再依赖
Document类,而是直接通过PdfDocument和PdfCanvas来操作页面内容 - 镜像翻转需要在导入源页面内容到目标页面时就应用变换矩阵,而不是复制页面后再做变换
- 你画框时误用了
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}"); } }
关键代码说明
- 页面内容导入方式:用
CopyAsFormXObject把源页面转换成可复用的XObject,这样可以通过矩阵变换控制它的绘制方式,这是iText 8中处理页面内容变换的标准方式 - 镜像变换时机:在
AddXObject之前调用ConcatMatrix,这样变换会直接作用于导入的页面内容 - 边框绘制修正:把
SetFillColor改为SetStrokeColor,确保黑色是用于描边(而不是填充矩形内部),和原iTextSharp的逻辑保持一致 - 文档资源管理:严格使用
using块管理所有PDF相关对象,确保资源正确释放
备注:内容来源于stack exchange,提问作者DiGi
相关产品推荐
相关产品推荐

