Sle*_*nej 3 java text-extraction pdfbox android-studio
我正在 Android Studio 库上使用https://github.com/TomRoush/PdfBox-Android PDFBox 从 PDF 文档中提取文本。这就是我正在做的事情:
\n\nFile pdf_file = new File(file_path);\nRun Code Online (Sandbox Code Playgroud)\n\n创建文件,然后
\n\nPDDocument document = null;\ndocument = PDDocument.load(pdf_file);\nRun Code Online (Sandbox Code Playgroud)\n\n将文件加载到 PDDocument 对象中,然后
\n\nPDFTextStripper pdfStripper = new PDFTextStripper();\npdfStripper.setStartPage(...);\npdfStripper.setEndPage(...);\nString page_text = pdfStripper.getText(document);\nRun Code Online (Sandbox Code Playgroud)\n\n获取页面的文本内容。问题是,例如,当出现“firm”一词时,它会显示为“fi rm”。它基本上在 fi 之后放置一个空格(我猜 fls 和其他连字)。我尝试阅读此Problems with extracting OpenTypeFont text using pdfBox但我不明白如何解决它。没有解决方案的详细信息。
\n\n重要提示:事实证明,在我的 PDF 文件中,我没有任何连字,例如 \xef\xac\x81,但我有常规 fi,但后面有空格。解决方案尚不清楚。
\n\nPDF文件:https://wetransfer.com/downloads/09e9036dda4a7962ccad32b1cbcd8edc20200506050349/ab4752
\n\n\n\n问题是,例如,当出现“firm”一词时,它会显示为“fi rm”。
\n
原因很简单:“fi”后面有一个空格!
\n\n这是文本绘制指令,绘制示例文件中第一次出现“firm”的线条:
\n\n\n\n [( )360.3(Mr Dursley was the director of a \xe2\x80\x9c)250( )110.3(rm called Grunnings, )]TJ\nRun Code Online (Sandbox Code Playgroud)\n\n字节\xe2\x80\x9c(147) 通过字体编码映射到字形名称fi,并通过字体的ToUnicode映射映射到 Unicode 字符 U+fb01(拉丁小连字 fi)。
因此,PDF 查看器显示连字字形\xef\xac\x81,文本提取器提取 Unicode 连字字符\xef\xac\x81或扩展后的字符f和i。
\n\n在该连字之后,绘制下一个字形的起点向左移动 250 个单位,然后绘制一个空格,然后将下一个起点向左移动 110.3 个单位,然后绘制“rm”。
\n\n因此,您在查看器中看不到“fi”和“rm”之间的间隙(因为向左移动抵消了空格字形的绘制),但文本提取器提取了空格字符(因为它在那里)。
\n\n您可以检查这不是 PDFBox 的怪癖,例如,带有复制和粘贴功能的 Adobe Reader 将该文本行提取为
\n\nMr Dursley was the director of a fi rm called Grunnings,\nRun Code Online (Sandbox Code Playgroud)\n\n就像 PDFBox 一样,它扩展连字并提取空格字符。
\n| 归档时间: |
|
| 查看次数: |
868 次 |
| 最近记录: |