ITextSharp - VB.NET - PdfTextExtractor - PDF 到 TXT - 缺少部分页面文本

Posted

技术标签:

【中文标题】ITextSharp - VB.NET - PdfTextExtractor - PDF 到 TXT - 缺少部分页面文本【英文标题】:ITextSharp - VB.NET - PdfTextExtractor - PDF to TXT - missing part of the page text 【发布时间】:2021-08-11 18:14:03 【问题描述】:

我在使用 PdfTextExtractor GetTextFromPage 方法时遇到问题,其中部分文本丢失,无论我是否运行所有页面......我仍然找不到部分文本。我对所有 pdf 提取使用相同的代码剪辑器,以前从未遇到过问题.. 可能是 pdf 文件搞砸了?

我尝试过没有策略,使用 LocationTextExtractionStrategy 和 SimpleTextExtractionStrategy ...结果发生了一些变化,但仍然无法获取所有文本。

我正在测试这个公共文档,我需要从中读取一些数据,下载和获取所有文本的代码 sn-p 非常简单:

webc.DownloadFile("http://www.inmetro.gov.br/legislacao/pam/pdf/PAM007426.pdf", "C:\test\PORTARIA.pdf")
pdf = New PdfReader("C:\test\PORTARIA.PDF")

Dim strategy As ITextExtractionStrategy = New LocationTextExtractionStrategy

For i = 1 To pdf.NumberOfPages
   TextBox3.AppendText(Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(PdfTextExtractor.GetTextFromPage(pdf, i, strategy)))) + vbNewLine + vbNewLine)
Next

我只对第一页感兴趣,我需要提取一些数据 .. 找不到像“fabricante”、“marca”、“PESO EXATO BALANÇAS”等词

有人知道为什么会这样吗???我很想看到实现这一目标的其他选择。不花钱买工具

【问题讨论】:

Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(...))) 是干什么用的? 请附上示例 PDF 以重现问题 @KJ 将 i=0 放入 pdf.numberpages 我得到一个空指针异常。我一直使用 1 .. 我无法获得与您相同的文本。这怎么可能哈哈... @AlexeySubach 你得到了代码 sn-p 中的链接。 @mkl 我从很久以前尝试过的一个例子中得到了这条线。我现在只是为未来的项目创建一个测试功能。我将生成的纯文本放到一个文本框/字符串中,这样我就可以找到用于读取数据的模式.. 【参考方案1】:

我只对第一页感兴趣,我需要提取一些数据.. 并且找不到像“fabricante”、“marca”、“PESO EXATO BALANÇAS”等词

我测试如下:

Dim pdfReader As New PdfReader("PAM007426.pdf")
Dim strategy As ITextExtractionStrategy = New LocationTextExtractionStrategy

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

Console.WriteLine("Position of 'fabricante': 0", text.IndexOf("fabricante"))
Console.WriteLine("Position of 'marca': 0", text.IndexOf("marca"))
Console.WriteLine("Position of 'PESO EXATO BALANÇAS': 0", text.IndexOf("PESO EXATO BALANÇAS"))

输出:

Position of 'fabricante': -1
Position of 'marca': 1061
Position of 'PESO EXATO BALANÇAS': 1067

如您所见,"marca""PESO EXATO BALANÇAS" 都会立即找到。

查看 PDF 很清楚为什么找不到 "fabricante":页面上没有那个字,只有 "FABRICANTE"。测试

Console.WriteLine("Position of 'FABRICANTE': 0", text.IndexOf("FABRICANTE"))

返回

Position of 'FABRICANTE': 1303

这样,你漏掉的字都能找到。

因此,如果您在 TextBox3 中找不到它们,则说明存在其他问题。也许是转换狂欢Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default, Encoding.UTF8, Encoding.Default.GetBytes(...))),也许文本框太满了,也许是别的。

【讨论】:

@KJ 对。在这里,我只是另外提供了 OP 可以用来识别问题的测试代码。 @fferrandini 顺便说一句,我使用了最新的 iText 5.x 版本。也许一些非常旧的版本在映射到 Unicode 时仍然存在一些问题。

以上是关于ITextSharp - VB.NET - PdfTextExtractor - PDF 到 TXT - 缺少部分页面文本的主要内容,如果未能解决你的问题,请参考以下文章

vb.net 导出PDF

PDF文件损坏,将内存流移动到文件流时无法修复

C#工具类:使用iTextSharp操作PDF文档

PDF 生成后无法打开 (vb.net) (asp.net)

C#可以用itextsharp 打开PDF文件吗?

iTextSharp + FileStream = 损坏的 PDF 文件