能否用C#与iText提取PDF页面属性排查Adobe DC旋转问题?
使用C#和iText提取PDF单页属性排查Adobe DC旋转问题
可以用C#结合iText7提取PDF单页的所有属性,对比正常页面和异常页面的差异,下面是具体操作指引:
1. 安装iText7依赖
打开Visual Studio的NuGet包管理器,搜索并安装iText7(这是iText的最新稳定版本,推荐使用)。
2. 编写属性提取代码
以下是完整的C#示例代码,可提取单页的旋转角度、页面尺寸、字典属性,甚至内容流中的旋转指令:
基础属性提取代码
using iText.Kernel.Pdf; using System; using System.Collections.Generic; class PdfPagePropertyExtractor { static void Main(string[] args) { // 替换为你的PDF文件路径 string pdfPath = "pages_from_620449.pdf"; using (PdfDocument pdfDoc = new PdfDocument(new PdfReader(pdfPath))) { // 遍历所有页面(PDF页码从1开始) for (int pageNum = 1; pageNum <= pdfDoc.GetNumberOfPages(); pageNum++) { PdfPage page = pdfDoc.GetPage(pageNum); Console.WriteLine($"=== 第{pageNum}页属性 ==="); // 1. 提取页面旋转角度 int rotate = page.GetRotation(); Console.WriteLine($"旋转角度: {rotate}°"); // 2. 提取页面尺寸(媒体框MediaBox为原始尺寸) PdfArray mediaBox = page.GetMediaBox(); if (mediaBox != null) { float width = mediaBox.GetAsNumber(2).FloatValue() - mediaBox.GetAsNumber(0).FloatValue(); float height = mediaBox.GetAsNumber(3).FloatValue() - mediaBox.GetAsNumber(1).FloatValue(); Console.WriteLine($"原始尺寸: 宽{width:F2}, 高{height:F2}"); Console.WriteLine($"媒体框参数: {mediaBox.ToString()}"); } // 3. 提取裁剪框(实际显示的页面区域) PdfArray cropBox = page.GetCropBox(); if (cropBox != null) { Console.WriteLine($"裁剪框参数: {cropBox.ToString()}"); } // 4. 提取页面字典的所有键值对(包含隐藏/自定义属性) PdfDictionary pageDict = page.GetPdfObject(); foreach (PdfName key in pageDict.KeySet()) { Console.WriteLine($"[{key.ToString()}]: {pageDict.Get(key).ToString()}"); } Console.WriteLine("------------------------"); } } } }
提取内容流中的旋转指令(针对扫描件)
如果是扫描生成的PDF,页面内容可能包含隐藏的旋转指令,可添加以下代码捕捉:
using iText.Kernel.Pdf.Canvas; using iText.Kernel.Pdf.Canvas.Parser; using iText.Kernel.Pdf.Canvas.Parser.Data; using iText.Kernel.Pdf.Canvas.Parser.Listener; // 在Main方法中处理页面时添加: PdfCanvasProcessor processor = new PdfCanvasProcessor(new RotationCaptureListener()); processor.ProcessPageContent(page); // 自定义监听器类 private class RotationCaptureListener : IEventListener { public void EventOccurred(IEventData data, EventType type) { if (type == EventType.ROTATE) { RotateEvent rotateEvent = (RotateEvent)data; Console.WriteLine($"内容流旋转指令: {rotateEvent.GetAngle()}°"); } } public ICollection<EventType> GetSupportedEvents() { return new List<EventType> { EventType.ROTATE }; } }
3. 重点对比的属性方向
生成正常页面和异常页面的属性输出后,重点对比以下内容:
- 页面
Rotate属性的数值:异常页面是否存在非0的默认旋转值,或与正常页面差异 - 页面宽高比例:异常页面是否宽小于高(但旋转为0),可能导致Adobe Enhance误判方向
- 页面字典中的特殊键值:比如是否存在
Rotate之外的旋转相关自定义属性 - 内容流中的旋转指令:扫描件是否在内容层面隐藏了旋转操作
通过对比这些差异,就能定位出Adobe DC Enhance操作解读的旋转触发属性。
内容的提问来源于stack exchange,提问作者Richard Anderson
相关产品推荐
相关产品推荐

