c# - 使用 iTextSharp 阅读 PDF 时出现奇怪的字符

标签 c# pdf itext

我正在使用 iTextSharp 来阅读 PDF 文件。我尝试使用以下简单代码阅读第一页中的全文:

var pdfReader = new PdfReader("<fileName>");
var pageText = PdfTextExtractor.GetTextFromPage(pdfReader, 1, new SimpleTextExtractionStrategy());

它返回一个像这样的字符串:

"\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 !\n\"\0\0\0\0\0\0 #\0 $\0 %\0 & $\0 '\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0 !\n\"\0\0\0 (\n\0\0\0 )\0\0 *\0 + ,\0 ,\0\0 & ,\0 -\0 .#\0\0\0 & $\0 ,\0/\n+\0 & &\0 * 0\0 1 .\n2\0 3\n4 -\0 5\0\0 $\0\0 #\0\0\0 & $\0 ,\0 * &\0\0 '\0 .\n6\n\0\0\0 -\0\0\0\0 &\0\0\0\0\0\0\0 ,\0 #\0\0\0 & $\0 ,\0\0\0 &\0 #\0\0 & $ ') &\0\0\0\0 #\0 ' '\0 7 -\0 $\0\0 7\0 '\0 ,\0 8\n9 5\0\0 ,\0\0 $ $\0\0\0\0\0 '\0\0 3\n\0\0\0 )\0\0\0\0 4 -\0 5\0\0 $\0\0 * &\0\0 '\0 .\n\0\0\0\0 #\0 $\0 $\0\0 )\0\0\0 : 0 ;\0 ; <; : 1 ; +\0 = < 9 = << >\0 ?\0 ?\0 3\0 (\n@\n\0\0 #\0 $\0 %\0 & $\0 ’\0 ! 3\n\0 ......"

我可以使用 Acrobat Reader 和浏览器阅读原始 PDF。该文件似乎是 PDF/A。

我使用的代码适用于其他 PDF。

iText 对这个标准有问题吗?

有人能指出我正确的方向吗?

更新

从 Acrobat 复制/粘贴会导致文本损坏。我不认为这是 iTextSharp (5.5.10) 问题。

更新

您可以尝试使用此文件: PDF Example

最佳答案

该文件不包含文本提取所需的信息。此外,该文件作为 PDF/A 文件无效。

文本提取信息

示例文件包含显示空表单的背景(位于表单 XObject 资源中)和填充值的前景(紧邻页面内容流中)。

XObject 表单中的文本是使用 Type 3 字体绘制的,其编码中没有标准编码或标准名称。其中也没有 ToUnicode 映射。

这意味着 XObject 形式的文本绘制指令具有字节序列参数,并且对于每个字节值,Type 3 字体对象提供一个包含简单绘制指令的流(使用线条定义路径)和曲线;路径填充指令),但没有哪个 Unicode 值对应于该字节值或一组绘图指令的信息。

因此,PDF 查看器可以绘制页面,但他们无法正确地将 Unicode 字符串放入剪贴板(我们人类将从该绘图中读取这些字符串),iTextSharp 也不能。

如果没有 OCR,就没有合理的方法从表单中提取文本。


另一方面,紧邻前台的文本是使用标准编码 (WinAnsiEncoding) 的字体绘制的,因此可以提取。因此,在OP代码输出的末尾,您会发现

\u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000 \u0000

 ...

\u0000 \u0000 \u0000 x s \u0000 l t n q o x m l \u0000 z \u0000 ~ { \u0000 } } \u0000 l w x
2016
14874587948 DITTA PROVA SRL
CREMA CR 26013 VIA DANTE 17
011110
LPRGCM82T26D150H LEOPARDI GIACOMO
M 26 12 1982 CREMONA CR
MILANO MI F205
28 02 2017
DITTAP0101 / LEOGIA01001

即表单的填写值。

PDF/A 一致性

该文件确实声称是 PDF/A-1a,但检查后很快就会发现这是一个公然的谎言。例如。 Adobe Acrobat 预检 说:

Preflight report screenshot

这些条目表明该文档实际上并没有尝试真正符合 PDF/A-a1,它只是声称如此。

关于c# - 使用 iTextSharp 阅读 PDF 时出现奇怪的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42535683/

相关文章:

c# - 将 XHTML5 解析为 XDocument

R ggplot2 : Blank page before plot with pdf() and ggplot_gtable()/ggplot_build()

php - 在 DOMPDF 中打印边距

java - 如何扩展PDF页面大小以添加水印?

c# - iTextSharp GetWidthPoint() 不包括字母间距

c# - 提取 IEnumerable<T> 中其键值等于 IEnumerable<U> 中的键值之一的项目

c# - 将节点添加到特定的子节点

c# - 可以(错误地)使用 Exception.HelpLink 来识别 Exception 对象吗?

javascript - iTextSharp PDFAction.PrintDialog 在 MS Edge 中不起作用

c# - 如何使用 iText 7 重新排序 pdf 文档