Java PDFBox文本提取连字“;“fi”&引用;fl";安卓工作室的问题

Java PDFBox文本提取连字“;“fi”&引用;fl";安卓工作室的问题,java,android-studio,pdfbox,text-extraction,Java,Android Studio,Pdfbox,Text Extraction,我正在使用Android Studio库上的PDFBox从PDF文档中提取文本。以下是我正在做的: File pdf_file = new File(file_path); 创建文件,然后 PDDocument document = null; document = PDDocument.load(pdf_file); 将文件加载到PDDocument对象中,然后 PDFTextStripper pdfStripper = new PDFTextStripper(); pdfStripper

我正在使用Android Studio库上的PDFBox从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和其他连字)。我试着读了这篇文章,但我不知道如何修复它。没有解决方案的详细信息

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


PDF文件:

如评论中所述,我曾经遇到过类似的连字问题。我不得不检查PDF文件中的某些字符串,我想知道为什么有些字符串不起作用。经过分析,我发现这些文件包含连字,因此我无法找到“Textfield”,即使它在视觉上包含它。我的解决方案是不仅搜索
textfield
,还搜索
文本字段
——因此搜索两个字符串,一个带连字,一个不带连字

你说你想从pdf文件中提取文本。因此,我将添加一个后处理步骤

  • 像现在一样提取文本
  • 搜索所有连字,例如“fi”和“fi”,并将其替换为“fi”
  • 我的证件在结扎后没有空间,所以我会考虑这两种情况。还应考虑词尾的情况(例如buffi)(可能是两个空格?)

    总而言之:这个话题并不容易,因为你已经研究过了。此步骤称为。在pdfbox 2.X中,这是在内部完成的(cp.pdfbox-2384),但在pdfbox 1.X中,TextNormalize.java是

    Upate:

    您可以尝试的另一种可能性是更改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)。好的是,它只在发现韧带时才使用。然而,这似乎不是一个普遍的解决办法,因为问题的话,以一个结扎结束。但在你的情况下,你应该是好的,因为每次结扎后似乎总是有一个空间

    问题是,例如,当有“firm”这个词时,它会显示为“firm”

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

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

    [()360.3(杜斯利先生是一家“)250()110.3(rm称为格朗宁,)]TJ的董事
    
    通过字体编码将字节
    (147)映射到字形名称fi,并通过字体映射到Unicode字符U+fb01,即拉丁小连字fi

    因此,PDF查看器显示连字符号fi,文本提取器提取Unicode连字字符fi,或在展开字符fi后提取

    在该连字之后,绘制下一个图示符的起点向左移动250个单位,然后绘制一个空间,然后将下一个起点向左移动110.3个单位,然后绘制“rm”

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

    您可以检查这是否是PDFBox的怪癖,例如,具有复制粘贴功能的Adobe Reader将文本行提取为

    Dursley先生是一家名为Grunnings的公司的董事,
    

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

    请共享该文件。我想知道桌面版PDFBox是否会出现这种情况。@Tilmanhausher您好,我用链接更新了我的问题,下载了PDFI。我也有一次遇到这个问题,我通过搜索fi和fi(连字)解决了这个问题@Lonzak嗯,你到底是怎么修复的?你找到了连字fi,然后去掉了后面的空格?@JingleBells看到我贴出的答案…你确定你在最后一段中是指文本吗?是的,当然,我是指Pdfbox…谢谢你发现了这个嗯,原来我没有连字。是“文本字段”,不是“文本字段”,因此替换方法不起作用:\n出于某种原因,它在fi后面放了一个空格,而不是fi@Lonzak考虑到上面的消息,你知道修复它的方法吗?@mkl考虑到“fi”是f和i,而不是fi,我在PDF中没有连字,但在“fi”后面有一个空格。您知道解决方案吗?您可能希望尝试删除所有空格,并让PDFBox在适当的位置插入空格,如中所示。感谢您的回答!结果表明,fi和rm之间实际上存在空格,PDF查看器使用“坐标”工作忽略空格,但当PDFBox提取文本时,空格实际上就在那里。这是PDF文件本身的问题还是其他PDF文件会出现问题?上面评论中的建议很好,但我不确定我是否要删除所有空格,并相信PDFBox会在它认为必要的地方添加。我发现的解决方案是只查找fi和fl,然后删除空格。据我所知,以fi或fl结尾的英语单词不多。无论如何,我真的希望这是PDF文件本身及其协调系统的问题。严格地说,“实现简单正确的文本提取”这不是PDF文件的要求,因此这本身不是问题。但这种复杂化确实是完全不必要的(就PDF标准而言);因此,如果您与PDF制作人签订了合同,其中制作人承诺提供额外的文本