Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用iTextSharp从PDF中提取文本不适用于某些PDF_C#_Pdf_Itextsharp_Pdftotext - Fatal编程技术网

C# 使用iTextSharp从PDF中提取文本不适用于某些PDF

C# 使用iTextSharp从PDF中提取文本不适用于某些PDF,c#,pdf,itextsharp,pdftotext,C#,Pdf,Itextsharp,Pdftotext,我使用以下代码使用iTextSharp从PDF文件的第一页提取文本: public static string ExtractTextFromPDFFirstPage(string fileName) { string text = null; using (var pdfReader = new PdfReader(fileName)) { ITextExtractionStrategy strategy = new SimpleTextExtracti

我使用以下代码使用iTextSharp从PDF文件的第一页提取文本:

public static string ExtractTextFromPDFFirstPage(string fileName)
{
    string text = null;
    using (var pdfReader = new PdfReader(fileName))
    {
        ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy();

        text = PdfTextExtractor.GetTextFromPage(pdfReader,1,strategy);

        text = Encoding.UTF8.GetString(Encoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(text)));

    }
    return text;
}
它对许多PDF文件都很有效,但对其他一些文件则不然

工作PDF:

不工作PDF:

这两个PDF看起来非常相似,但一个正常工作,另一个不正常。 我想他们的制作人标签不一样的事实就是一个线索。 另一个线索是,该函数适用于没有图表的PDF的任何其他页面

我也尝试过ghostscipt,但没有成功

编码行似乎也没用

如何使用iTextSharp提取非工作PDF第一页的文本


谢谢

这两个文档在编码/差异数组中都使用带有非官方字形名称的字体,并且都不使用ToUnicode映射。字形命名似乎有点直截了当:MT前缀后面的数字是所用字形的ASCII码

第一个文档可以工作,因为映射根本没有更改,iText将使用默认编码(我猜):

另一个文档确实更改了映射:

/Differences [2 /MT76 /MT105 /MT103 /MT104 /MT116 /MT110 /MT32 /MT97 /MT100 /MT115 /MT58 ]
这意味着:例如,字符代码2应该映射到名为MT76的标志符号,这是iText不知道的非官方/私有标志符号名称,因此它没有更多信息,只有字符代码2,并将使用此代码获得最终结果(我猜)

如果不实现MT前缀标志名称的逻辑,就不可能从该文档中获取正确的文本。无论如何,还没有定义一个以MT开头,后跟整数的字形名称可以映射到ASCII值。。。这完全是偶然的,或者是由字体设计器/创建工具实现的,不管它来自何处。

第二个PDF(LFBP.PDF)包含从字形到文本的不正确映射,即,您看到了正确的字形,但在生成此PDF期间,由于某种原因,文本表示未正确编码。如果您有很多这样的文件,那么工作方法可能是:

  • 在提取文本时,通过搜索应该出现在每页上的短语(如“服务”)来检测断页
  • 使用OCR和以下工具分别处理这些页面

两个链接都返回503错误…抱歉,filebin.ca似乎不可靠。。。我在别处托管了这些文件并编辑了与您的问题没有直接关系的消息,但完全删除了行
text=Encoding.UTF8.GetString…
,因为它没有执行您认为它可能正在执行的操作。谢谢你的回答。这是否意味着无法从该文件中提取文本?为什么从同一文档的其他页面提取文本会起作用呢?只需要显式地遵循未记录和未指定的逻辑:MT{ASCII}。第一个文档有效,因为eg.65映射到MT65,66映射到MT66。。。字符代码与映射的ASCII值相同。第二个文档不是这样的:2到MT76,3到MT105,…那么,有没有办法手动创建映射?我该怎么做?我假设我需要从中提取文本的所有其他文件都具有相同的自定义映射。我必须承认我对iText一点也不熟悉。因此,我无法回答是否以及如何使用自定义图示符名称,对不起。我已经使用ByteScout pdf Multitool实用程序(修复损坏字体的OCR模式+选择法语)尝试了这个LFBP.pdf,它适用于非旋转文本,但旋转文本不适用于OCR。注-我隶属于ByteScout
/Differences [2 /MT76 /MT105 /MT103 /MT104 /MT116 /MT110 /MT32 /MT97 /MT100 /MT115 /MT58 ]