仅从PDF中提取粗体文本的最佳方法

时间:2010-10-01 10:06:54

标签: c# java pdf text fonts

iTextSharp是一个很棒的工具,我可以使用 PdfTextExtractor.GetTextFromPage(reader, iPage) + " "; 并且效果很好,但有没有办法从pdf中提取粗体文本(例如头条新闻),而不是一切?

无论编程语言如何,任何解决方案都很有用。谢谢

2 个答案:

答案 0 :(得分:3)

在iText中,您需要使用com.itextpdf.text.pdf.parser包中的类。

具体来说,您需要使用带有自定义TextExtractionStrategy的PdfTextExtractor来检查字体名称。大胆的字体USUALLY在他们的名字中拥有世界“大胆”。

潜在问题: 1)并非所有看起来像文本的内容都使用字体和字母进行渲染。它可以是路径或位图。提取此类文本的唯一方法是使用OCR,并且无法获取字体信息。 2)字体编码。映射到您在PDF中看到的字形的字节可能没有从这些字节到实际字符信息的映射。 3)并非所有粗体文本都使用粗体字体。通过用相当细的线条和通常的填充来抚摸文本轮廓来制作一些粗体文本。在这种情况下,文本渲染模式将被设置为“stroke& fill”而不是通常的“fill”。这种情况非常罕见,但确实会不时发生。

测试问题1和2的简单方法是尝试在Reader / Acrobat中复制和粘贴文本。如果你不能选择它,它几乎肯定是路径或图像。如果你可以选择它,但是粘贴后字符会随机出现垃圾,那么iText将会出现相同的垃圾。

问题3并不难以通过编程方式进行测试,尽管您必须根据具体情况对其进行处理。您需要调用TextRenderInfo.getTextRenderMode()。 0是填充(标准的处理方式),2是“笔划和填充”。

所以你的TextExtractionStrategy可以存根beginTextBlock,endTextBlock,renderImage和getResultantText。在renderText实现中,您必须检查字体名称(对于“粗体”,不区分大小写)和文本呈现模式。如果是这种情况,那么它就是你标题的一部分。

所有这一切都假设您正在处理任意PDF文件。如果您的所有PDF都来自同一个来源,您可以开始偷工减料。我将把它作为读者的练习。

答案 1 :(得分:1)

这项工作最好的赌注之一是TET by pdflib.com,它能够提取到TETML格式。适用于Windows,Mac OS X,Linux,Solaris,AIX,HP-UX ......

我不确定它是否确实识别出“头条新闻”(因为PDF不太了解结构标记,只有 visual 标记) - 但是它肯定可以告诉你每个字符串使用的确切位置和 font