如何检测是否通过工具扫描或生成pdf

时间:2017-12-26 10:21:10

标签: c# .net pdf pdf-generation ocr

我正在开发一个产品,我们接受输入作为pdf文件。我们通过第三方API阅读pdf的内容。如果pdf是扫描文件或具有复制限制,则这些API会失败; API未在输出中提供这些详细信息。

C#中是否有任何方法可以检测PDF是否是普通文件的扫描文件?因此,我可以向用户显示相应的消息。

我正在使用c#并使用ABCPDF。

3 个答案:

答案 0 :(得分:1)

我过去使用过的一种方法是:你可以使用一些pdf ocr api和create a searchable PDF。然后将OCR输出与文本内容进行比较。如果PDF是基于文本的,那么OCR结果和原始文本几乎相同。否则会有很大的不同。

答案 1 :(得分:0)

您可以查看文档每个页面的内容。扫描的文档只包含类型为Image的对象,而#34; normal" PDF包含文本对象和其他对象。 以下是Patagames PDF SDK的示例代码。但是你的API可能有模拟

        PdfCommon.Initialize();

        using (var doc = PdfDocument.Load(@"d:\1\Europa Service Karte.pdf"))
        {
            foreach(var page in doc.Pages)
            {
                foreach(var obj in page.PageObjects)
                {
                    if(!(obj is PdfImageObject))
                    {
                        return; //this is a "normal" pdf;
                    }
                }
            }
            //there is no any page with non image objects
            //so it is a scanned PDF
        }

答案 2 :(得分:0)

要查看页面是否包含任何文本,可以使用Doc.GetText方法(并测试其返回的字符串的长度)。或者,对于更复杂的方法,请尝试TextOperation类。

对于图像,您可以使用以下代码在页面上计算图像:

    doc.PageNumber = 2;
    ImageOperation op = new ImageOperation(doc);
    op.PageContents.AddPages(doc.PageNumber);
    IList<ImageProperties> images = op.GetImageProperties();

然后检查images.Count是否为零。

关于复制限制,如果您尝试在未提供密码的情况下阅读受密码保护的PDF,则ABCpdf将引发异常。你可以抓住的:)

否则,ABCpdf将适用并尊重Adobe要求的PDF权限。您可以使用Doc.Encyption属性来设置/获取它们。 [我隶属于ABCpdf。]