我在使用pdfbox阅读pdf时遇到了问题 . 我的实际pdf是部分不可读的,所以当我在编辑器中复制并粘贴不可读的部分时,它会显示小盒符号,但当我尝试通过pdfbox读取相同的文件时,这些字符不会被读取(我不指望它们待读) . 我期望的是,我至少得到一些符号或一些随机字符而不是实际字符 . 有没有办法做到这一点 . 该行已被选中,因此它不是图像 . 有没有人找到任何解决方法?
有一个pdfbox示例,我们覆盖pdfTextStripper类下的writeString方法以获得一些额外的字体属性 . 我正在使用该方法来获取我的文本和一些字体属性 . 所以我的问题是为什么pdfbox没有't read every character(it may print gibberish). But in my case, I counted the no. of times the method was called(each method call correspond to each character) and saw that the no. of method calls did match the no.of characters in output text but didn'匹配总数 . pdf中的字符 . 在这里's a sample pdf, the word 1133508 is unreadable and pdf doesn'甚至显示这个词的乱码,它只是完全跳过它 . 这是链接 . https://drive.google.com/file/d/0B_Ke2amBgdpedUNwVTR3RVlRTFE/view?usp=sharing
1 回答
第一个文件“PnL_500010_0314.pdf”
实际上,实际上整条线"Statement of Profit and Loss for the year ended March 31, 2014"还有更多不能被提取出来;检查内容原因变得很明显:此文本使用复合字体编写,该字体既没有 Encoding 也没有 ToUnicode 条目,无法识别相关字符 .
在调用
processTextPosition
(PDFTextStripper
实现并从中检索其文本信息)之前不久,org.apache.pdfbox.text.PDFTextStreamEngine
(从中派生PDFTextStripper
)方法showGlyph
包含以下代码:有问题的字体没有提供文本提取的任何线索 . 因此,
unicode
这里是null
.此外,字体是复合的,而不是简单的 . 因此,执行了
else
子句,甚至没有调用processTextPosition
.PDFTextStripper
因此,根本没有告知"Statement of Profit and Loss for the year ended March 31, 2014"行甚至存在!如果你替换它
在
PDFTextStreamEngine.showGlyph
中通过某些代码设置unicode
,例如使用Unicode替换字符你会得到
不幸的是
PDFTextStreamEngine.showGlyph
方法使用了一些私有类成员 . 因此,不能简单地使用原始方法代码在一个人自己的PDFTextStripper
类中覆盖它,并带有上面指出的更改 . 要么必须在一个人自己的类中复制PDFTextStreamEngine
的几乎所有功能,要么必须使用Java反射,或者必须自己修补PDFBox类 .这种架构并不完美 .
第二个文件“Bal_532935_0314.pdf”
第二个文件的大小写是由上面引用的同一段PDFBox代码引起的 . 但是,这次,字体很简单,执行另一个代码块:
这里发生的是纯猜测:如果没有将字形代码映射到Unicode的信息,我们假设映射是Latin-1,它简单地嵌入到
char
中 . 随着在OP的第二个文件中可见,这个假设并不总是成立 .如果您不希望PDFBox在此处做出类似这样的假设,也请将上面的
if
块替换为这导致了