当前位置: 首页 > 知识库问答 >
问题:

Android Studio上的PDFBox文本提取连字“fi”、“fl”问题

咸承教
2023-03-14

我在Android Studio库上使用这个https://github.com/TomRoush/PdfBox-AndroidPDFBox从PDF文档中提取文本。这是我正在做的事情:

File pdf_file = new File(file_path);

创建文件,然后

PDDocument document = null;
document = PDDocument.load(pdf_file);

将文件加载到PDDocument对象中,然后

PDFTextStripper pdfStripper = new PDFTextStripper();
pdfStripper.setStartPage(...);
pdfStripper.setEndPage(...);
String page_text = pdfStripper.getText(document);

获取页面的文本内容。问题是,例如,当有“firm”这个词时,它会显示为“firm”。它基本上在fi后面加了一个空格(我猜是fls和其他连字)。我试图通过使用pdfBox提取OpenTypeFont文本来阅读这个问题,但我不知道如何解决它。没有解决方案详细信息。

重要提示:事实证明,在我的PDF文件中,我没有任何像fi这样的连字,但我有常规fi,但后面有空格。解决方案尚不清楚。

PDF文件:https://wetransfer.com/downloads/09e9036dda4a7962ccad32b1cbcd8edc20200506050349/ab4752

共有2个答案

王翰墨
2023-03-14

正如评论中提到的,我曾经在连字符方面遇到过类似的问题。我不得不检查PDF文件中的某些字符串,并且想知道为什么它对某些字符串不起作用。经过分析,我发现这些文件包含连字符,因此我找不到“Textfield”,即使它在视觉上包含它。我的解决方案是不仅搜索text field,还搜索text field-所以搜索两个字符串,一个有连字符,一个没有连字符。

你说你想从pdf文件中提取文本。所以我会添加一个后处理步骤。

  1. 像现在一样提取文本

我的文档在连字后没有空格,所以我会考虑这两种情况。还应考虑词尾的情况(例如buffi)(可能是两个空格?)。

总而言之:这个话题并不容易,因为你已经研究过了。此步骤称为NFKC规范化。在pdfbox 2中。X现在在内部(cp.PDFBOX-2384)完成,但在PDFBOX 1中完成。X文本规格化。java正在这样做。

更新日期:

您可以尝试的另一种可能性是更改PDFTextStripper。Java语言有一种方法叫做normalizeWord(…) 。它将单个“fi”连字转换为“f”和“i”。您可以在这里添加

//line 1971...
//for PDFs where ligatures are followed by a space (e.g. "fi ve") 
if(word.substring(q+1,q+2).equals(" ")) {
  p = q + 2;
}
else {
  p = q + 1;
}

但我只在PDFBOx2.0.19中使用了它(看起来您使用的是1.8.X)。好的是,它只在发现系带时使用。然而,由于以连字结尾的单词存在问题,这似乎不是一个普遍的解决方案。但在你的情况下,你应该很好,因为每次结扎后似乎总是有一个空格。

杨飞
2023-03-14

问题是,例如,当有“公司”这个词时,它会像“fi rm”一样显示它。

原因很简单:“fi”后面有一个空格!

这是文本绘图说明,用于绘制示例文件中第一次出现“firm”的线条:

 [( )360.3(Mr Dursley was the director of a “)250( )110.3(rm called Grunnings, )]TJ

通过字体编码将字节(147)映射到字形名称fi,并通过字体的ToUnicode映射到Unicode字符U fb01,即拉丁小连字fi。

因此,PDF查看器显示连字图示符fi,文本提取器提取Unicode连字字符fi或在扩展字符f和i后提取。

在连接之后,绘制下一个字形的起点向左移动250个单位,然后绘制一个空格,然后将下一个起点向左移动110.3个单位,然后绘制“rm”。

因此,在查看器中看不到“fi”和“rm”之间的差距(因为向左移动会抵消空间图示符的绘制),但文本提取器会提取一个空间字符(因为它在那里)。

您可以检查这不是PDFBox怪癖,例如带有副本的Adobe Reader

Mr Dursley was the director of a fi rm called Grunnings,

就像PDFBox一样,它扩展了连字并提取了空格字符。

 类似资料:
  • 我正试图从一组PDF文件中提取一些信息。这是目前为止的工作,但一个PDF给我的委屈。 我使用的是PDFBOX1.8.8和Java7。 我没有例外,什么都没有。有什么想法吗? 编辑:附加信息:使用Acrobat Distiller 9.0.0(Windows)创建,格式为PDF-1.6;其他PDF是版本1.4和1.5 似乎并不包含异国情调的角色。我可以在Evince PDF-viewer中标记/复制

  • 我有以下问题: 对于我的网站,我从谷歌字体中选择了webfont'Fira Sans Constreed'(拉丁文,拉丁扩展,西里尔文,西里尔文扩展)。为了生成字体格式,我使用了font Squirrel,它为我生成了扩展名为。woff和。woff2的文件。 我在下一个CSS代码中包括字体: 除了字母“fi”和“fl”的组合外,我的内容显示正确。例如:“wi-fi”就像“wi-”一样。 为了解决这

  • 问题内容: 我正在使用Apache PDFbox库从PDF文件中提取突出显示的文本(即黄色背景)。我对这个库是完全陌生的,并且不知道它用于哪个目的。到目前为止,我已经使用以下代码从注释中提取了文本。 现在,我需要突出显示文本,任何代码示例都将受到高度赞赏。 问题答案: 问题中的代码无法读取行中突出显示的确切文本,已经说明了大多数概念,这些概念可用于从具有PDFBox的页面上的有限内容区域提取文本。

  • 我使用Apache PDFbox库从PDF文件中提取突出显示的文本(即黄色背景)。我对这个库完全陌生,不知道该使用其中的哪个类。到目前为止,我已经使用下面的代码从注释中提取了文本。 现在我需要得到突出显示的文本,任何代码示例都将受到高度赞赏。

  • 嗨,这个问题是指之前的帖子: 有人能给我举个例子,说明如何使用PDFBox提取“单词”的坐标吗 我使用的是PDFBOX 2.0.10 我已成功编译了组合代码,但在尝试运行示例时出现异常错误。 提供的解决方案没有标准的主方法,这是我感到困惑的地方。 有人能告诉我怎样才能成功运行组合代码吗。 堆栈跟踪 可以在这里找到坐标https://github.com/mkl-public/testarea-pd

  • 我正在使用最新的PDFBOX库来提取文本,为了做到这一点,我编写了我的自定义PDFStreamEngine(shwoing部分代码,但其余应该类似): 然而,我有三个问题:第一个:“Tf”操作符-在PDF/F1中1 Tf:当我显示fontName和size时,它显示:evmanj+myriadpro-regular,size 1;但是,illustrator和adobe Acrobat上的实际字体