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

能否用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 14:40:23