【问题标题】:how to determine PDF file type using iTextSharp如何使用 iTextSharp 确定 PDF 文件类型
【发布时间】:2012-11-05 17:06:07
【问题描述】:

有没有办法确定 PDF 文件的类型:现有 PDF 文件是扫描图像还是使用 iTextSharp 和 C# 从数据文件创建的?

【问题讨论】:

  • 您的标准是什么?您如何区分来自扫描仪的 PDF 和其他类型的文档?是打印的字符数量吗?是图像覆盖的页面面积吗?它是创建 PDF 的程序的名称吗? iTextSharp 可以帮助您确定这些值,但您必须事先提出标准。
  • “你如何区分来自扫描仪的 PDF...” - 你甚至不能选择文本
  • 嗯,不一定是这样。有些扫描解决方案会执行一些额外的 OCR,然后通过不可见但可选择的文本来丰富扫描的 PDF。另一方面,使用 iTextSharp 和 C# 从数据文件创建 PDF 很容易,而没有任何可选择的文本。那么,我能否解释您的问题,以便您真正想要区分带有可选文本的 PDF 和没有可选文本的 PDF?
  • @ESB PdfTextExtractor.GetTextFromPage() 可以帮助您找出它是否包含任何文本。

标签: c# pdf itextsharp


【解决方案1】:

也许您可以在使用 iTextSharp 创建的 PDF 中添加一些元数据。

Read/Modify PDF Metadata using iTextSharp

【讨论】:

  • 我没有创建它们 - 我的文件夹中有大量它们,需要在不打开每个 pdf 的情况下确定它
【解决方案2】:

文档属性/高级/Pdf Producer

【讨论】:

    【解决方案3】:

    我刚刚在 PdfWriter 对象的监视窗口中搜索了正确的位置后,使用此方法替换了 PDF Producer,它更改了 PDF 中的“PDF Creator”,因为它默认无法访问:

        private static void ReplacePdfCreator(PdfWriter writer)
        {
            /*
    
             Warning
             * 
             This is not an option offered as is and i had to workaround it by using Reflection and change it
             manually.
             * 
             Alejandro
    
             */
            Type writerType = writer.GetType();
            PropertyInfo writerProperty =
                writerType.GetProperties(BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance)
                          .FirstOrDefault(p => p.PropertyType == typeof(PdfDocument));
    
            if (writerProperty != null)
            {
                PdfDocument pd = (PdfDocument)writerProperty.GetValue(writer);
                Type pdType = pd.GetType();
                FieldInfo infoProperty =
                    pdType.GetFields(BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance)
                          .FirstOrDefault(p => p.Name == "info");
    
                if (infoProperty != null)
                {
                    PdfDocument.PdfInfo pdfInfo = (PdfDocument.PdfInfo)infoProperty.GetValue(pd);
    
                    if (pdfInfo != null)
                    {
                        string creator = pdfInfo.GetAsString(new PdfName("Producer")).ToLowerInvariant();
    
            if(creator.Contains("itextsharp"))
            {
                // created with itext sharp
            }
            else if(creator.Contains("adobe"))
            {
                // created with adobe something (distiller, photoshop, whatever)
            }
            else if(creator.Contains("pdfpro"))
            {
                // created with pdf pro
            }
            else if(add your own comparison here, for example a scanner manufacturer software like HP's one)
            {
            }
                    }
                }
            }
    }
    

    【讨论】:

    • 那么问题的答案在哪里..?你能解释一下吗..?
    • 抱歉,我把它粘贴到了错误的线程中,但请解释一下?但是,您可以使用此代码稍作修改来确定它是如何创建的,更新上面的代码..
    猜你喜欢
    • 2015-07-12
    • 1970-01-01
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    • 2012-05-20
    • 2011-03-01
    相关资源
    最近更新 更多