我正在开发一个产品,我们接受输入作为pdf文件。我们通过第三方API阅读pdf的内容。如果pdf是扫描文件或具有复制限制,则这些API会失败; API未在输出中提供这些详细信息。
C#中是否有任何方法可以检测PDF是否是普通文件的扫描文件?因此,我可以向用户显示相应的消息。
我正在使用c#并使用ABCPDF。
答案 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。]