0

我们的数据库中有一个 PDF 格式的二进制文件。我将其流式传输并保存为 PDF 文件,并使用两个源进行了测试,最终得到相同的结果:PdfTextExtractor 拼错了一些单词。

例如,PDF 中有一个词“已确认”。PdfTextExtractor 转换后,拼写为“已确认”。

我在调试中逐步完成该过程,它在被 PdfTextExtractor 转换后立即拼写错误,所以我确信它不是不准确的,因为我正在做一些事情。

我能做些什么来提高 PdfTextExtractor 的准确性吗?

这是我目前正在使用的代码:

var reader = new PdfReader(myBinaryPdfData.ToArray());
var output = new StringWriter();

for (var i = 1; i <= reader.NumberOfPages; i++)
{
    output.WriteLine(PdfTextExtractor.GetTextFromPage(reader, i, new LocationTextExtractionStrategy()));
}

output.ToString();
4

1 回答 1

3

PDF 不一定以与文本的视觉表示相匹配的模式存储文本。“你好”这个词可以写成draw "Hello" at 10,10draw "H" at 10,10, "e" at 14,10, "l" at 18,10...。也可以draw "H" at 10,10, now draw a circle at 500,500, now show an image at 60,60, now draw "llo" at 18,10, now draw a square at 300,300, now draw "e" at 14,10

最后一个可能与您的实际情况相似。提取在文件中组合在一起的PdfTextExtractor文本块。在上面的最后一种情况下,它将按以下顺序返回三个字符串:“H”、“llo”、“e”。

允许大量格式化的 PDF 制作者(Adobe InDesign 和 Illustrator 是两个很好的例子)更有可能生成以非线性方式编写的 PDF。为什么?老实说,他们可能不太关心其中的数据,他们只关心 PDF 的视觉表示。(实际上,近年来,这两种产品在生成 PDF 方面都做得更好,尽管还不够完美。)

如果您想查看 PDF 的内部结构并让 Adob​​e Acrobat Pro 启动 Preflight(可能在工具或印刷制作中)。在打开的窗口中单击右上角的选项,然后单击浏览器内部 PDF 结构。单击顶部标有“BT”的拼图图标。打开给定页面并展开“内容”节点。每个文本条目都以 a 开头BT并以 . 结尾ET。展开每一个,你会看到类似(test) Tj. 括号标记要输出的实际文本的开始/停止。将此与您的实际期望进行比较。

如果你真的,真的必须在 iTextSharp 级别纠正这个问题,那么你就需要进行一些计算。您需要子类TextExtractionStrategy化或实现ITextExtractionStrategy接口。有关基本详细信息,请参阅这些链接。基本上,iTextSharp 的功能与以前完全相同,但除了文本之外,您将获得一些坐标,并且您必须弄清楚如何将它们拼凑在一起。您必须弄清楚字母的接近程度,以确定应该将字母注入单词的位置,或者该字母是否实际上构成了一个新单词/句子。祝你好运!

于 2012-04-24T13:30:51.483 回答