功能目的:要开发一个将PDF文件每一页切分成一张图片的功能。
因为项目之前是使用的 pdfrenderer,客户上传了一个PDF文件之后,表示切分的有问题,全是空白图片。然后查后台,似乎是jar包内包的错,然后换了个jar,在 mvnrepository.com 上搜的,如下网址下载的:
https://artifacts.alfresco.com/nexus/content/repositories/public/com/sun/pdfview/pdfrenderer/0.9.1-patched/
新的jar换上后,依旧报错,还是jar 包内部的错误:
java.nio.BufferUnderflowException
at java.nio.Buffer.nextGetIndex(Unknown Source)
at java.nio.HeapByteBuffer.get(Unknown Source)
at com.sun.pdfview.PDFFile.readName(PDFFile.java:906)
at com.sun.pdfview.PDFFile.readObject(PDFFile.java:448)
at com.sun.pdfview.PDFFile.readObject(PDFFile.java:405)
at com.sun.pdfview.PDFFile.dereference(PDFFile.java:315)
at com.sun.pdfview.PDFObject.dereference(PDFObject.java:698)
at com.sun.pdfview.PDFObject.getType(PDFObject.java:207)
at com.sun.pdfview.colorspace.PDFColorSpace.getColorSpace(PDFColorSpace.java:136)
at com.sun.pdfview.PDFImage.createImage(PDFImage.java:232)
at com.sun.pdfview.PDFParser.doImage(PDFParser.java:947)
at com.sun.pdfview.PDFParser.doXObject(PDFParser.java:932)
at com.sun.pdfview.PDFParser.iterate(PDFParser.java:697)
at com.sun.pdfview.BaseWatchable.run(BaseWatchable.java:102)
at java.lang.Thread.run(Unknown Source)
怒摔啊,要不要这么坑!好吧。看看日志,既然是 PDFFile 的 906 行报错,那么,把源文件下载下来改改吧。
PDFFile 906行如下:
while (isRegularCharacter(c = buf.get())) {
一上眼,感觉是 get() 方法报的错!那么,在get 前是否可以做做判断啥的呢,这些类真不是常用的类,翻开java API 文档慢慢找。终于找到你:hasRemaining() ,看这个方法的描述,似乎就是那么回事儿。把 906 行修改如下:
while (buf.hasRemaining() && isRegularCharacter(c = buf.get())) {
把 PDFFile 直接丢项目源码里面,当然路径用eclipse自动生成一下,重启tomcat,pdf上去重新切图,Oh~~GOOD! :) 问题解决。
Sun出的 jar 包啊,即使它不是常用的标准包,但你这么坑我,真的合适么?