PDFBox 无法从 PDF 文件页面生成图像
PDFBox unable to generate images from a PDF file pages
我一直在使用 PDFBox 将 pdf 文件拆分为图像有一段时间了,但是在更新到 2.0.19 后我开始 运行 出现意外异常。
这是异常的堆栈跟踪:
java.lang.ArrayIndexOutOfBoundsException: 3
at java.awt.color.ICC_ColorSpace.toRGB(ICC_ColorSpace.java:191)
at org.apache.pdfbox.pdmodel.graphics.color.PDICCBased.toRGB(PDICCBased.java:350)
at org.apache.pdfbox.rendering.PageDrawer.getPaint(PageDrawer.java:335)
at org.apache.pdfbox.rendering.PageDrawer.getNonStrokingPaint(PageDrawer.java:708)
at org.apache.pdfbox.rendering.PageDrawer.fillPath(PageDrawer.java:808)
at org.apache.pdfbox.contentstream.operator.graphics.FillEvenOddRule.process(FillEvenOddRule.java:37)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:875)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:509)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:483)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:156)
at org.apache.pdfbox.rendering.PageDrawer.drawPage(PageDrawer.java:269)
at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:321)
at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:243)
at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:203)
at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:190)
这是我用来拆分文件的代码:
try (PDDocument document = PDDocument.load(new File("updated_test.pdf"))) {
PDPageTree pdPages = document.getDocumentCatalog().getPages();
PDFRenderer pdfRenderer = new PDFRenderer(document);
int page = 0;
for (PDPage pdPage : pdPages) {
String fileName = "demo" + page + ".png";
File tempImg = new File(fileName);
BufferedImage bim = pdfRenderer.renderImage(page);
ImageIOUtil.writeImage(bim, tempImg.getAbsolutePath(), 150);
page++;
}
} catch (Exception e) {
e.printStackTrace();
}
这里是导致问题的实际文件:
https://Whosebuguploads.s3-us-west-2.amazonaws.com/updated_test.pdf
我们将不胜感激所有帮助、想法和建议,如果您对其他 solutions/libraries 可以达到相同结果的想法也非常有用。谢谢!
哇,谢谢你 Tilman Hausherr,根据你的评论,我基本上按照你的建议做了,但在 Java 中作为临时修复,直到你有机会制作快照版本:
FileInputStream fileInputStream = new FileInputStream(new File("updated_test.pdf"));
File file = new File("updated_test2.pdf");
if (file.exists()) {
file.delete();
}
FileOutputStream fileOutputStream = new FileOutputStream(new File("updated_test2.pdf"));
int i;
long m = 0;
char prev1 = '-';
char prev2 = '-';
char prev3 = '-';
while ((i = fileInputStream.read()) != -1) {
if (prev3 == '/' && prev2 == 'N' && prev1 == ' ' && i == '3') {
fileOutputStream.write('4');
} else {
fileOutputStream.write(i);
}
prev3 = prev2;
prev2 = prev1;
prev1 = (char)i;
m++;
}
fileOutputStream.flush();
fileOutputStream.close();
try (PDDocument document = PDDocument.load(new File("updated_test2.pdf"))) {
PDPageTree pdPages = document.getDocumentCatalog().getPages();
PDFRenderer pdfRenderer = new PDFRenderer(document);
int page = 0;
for (PDPage pdPage : pdPages) {
String fileName = "demo" + page + ".png";
File tempImg = new File(fileName);
BufferedImage bim = pdfRenderer.renderImage(page);
ImageIOUtil.writeImage(bim, tempImg.getAbsolutePath(), 150);
page++;
}
} catch (Exception e) {
e.printStackTrace();
}
非常感谢您及时的帮助!
这已在底部的 PDFBOX-4801 and a snapshot build is available here 中修复。
它将在 2.0.20 中发布,可能会在夏季发布(希望如此)。
原因是 CMYK ICC 配置文件字典中的 /N 值 (3) 不正确。正确的值应该是 4。这会导致稍后提到的异常。 corrected code 检查 ICC 配置文件并更正 PCICCBased 对象的值。
我一直在使用 PDFBox 将 pdf 文件拆分为图像有一段时间了,但是在更新到 2.0.19 后我开始 运行 出现意外异常。
这是异常的堆栈跟踪:
java.lang.ArrayIndexOutOfBoundsException: 3
at java.awt.color.ICC_ColorSpace.toRGB(ICC_ColorSpace.java:191)
at org.apache.pdfbox.pdmodel.graphics.color.PDICCBased.toRGB(PDICCBased.java:350)
at org.apache.pdfbox.rendering.PageDrawer.getPaint(PageDrawer.java:335)
at org.apache.pdfbox.rendering.PageDrawer.getNonStrokingPaint(PageDrawer.java:708)
at org.apache.pdfbox.rendering.PageDrawer.fillPath(PageDrawer.java:808)
at org.apache.pdfbox.contentstream.operator.graphics.FillEvenOddRule.process(FillEvenOddRule.java:37)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processOperator(PDFStreamEngine.java:875)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processStreamOperators(PDFStreamEngine.java:509)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processStream(PDFStreamEngine.java:483)
at org.apache.pdfbox.contentstream.PDFStreamEngine.processPage(PDFStreamEngine.java:156)
at org.apache.pdfbox.rendering.PageDrawer.drawPage(PageDrawer.java:269)
at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:321)
at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:243)
at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:203)
at org.apache.pdfbox.rendering.PDFRenderer.renderImage(PDFRenderer.java:190)
这是我用来拆分文件的代码:
try (PDDocument document = PDDocument.load(new File("updated_test.pdf"))) {
PDPageTree pdPages = document.getDocumentCatalog().getPages();
PDFRenderer pdfRenderer = new PDFRenderer(document);
int page = 0;
for (PDPage pdPage : pdPages) {
String fileName = "demo" + page + ".png";
File tempImg = new File(fileName);
BufferedImage bim = pdfRenderer.renderImage(page);
ImageIOUtil.writeImage(bim, tempImg.getAbsolutePath(), 150);
page++;
}
} catch (Exception e) {
e.printStackTrace();
}
这里是导致问题的实际文件: https://Whosebuguploads.s3-us-west-2.amazonaws.com/updated_test.pdf
我们将不胜感激所有帮助、想法和建议,如果您对其他 solutions/libraries 可以达到相同结果的想法也非常有用。谢谢!
哇,谢谢你 Tilman Hausherr,根据你的评论,我基本上按照你的建议做了,但在 Java 中作为临时修复,直到你有机会制作快照版本:
FileInputStream fileInputStream = new FileInputStream(new File("updated_test.pdf"));
File file = new File("updated_test2.pdf");
if (file.exists()) {
file.delete();
}
FileOutputStream fileOutputStream = new FileOutputStream(new File("updated_test2.pdf"));
int i;
long m = 0;
char prev1 = '-';
char prev2 = '-';
char prev3 = '-';
while ((i = fileInputStream.read()) != -1) {
if (prev3 == '/' && prev2 == 'N' && prev1 == ' ' && i == '3') {
fileOutputStream.write('4');
} else {
fileOutputStream.write(i);
}
prev3 = prev2;
prev2 = prev1;
prev1 = (char)i;
m++;
}
fileOutputStream.flush();
fileOutputStream.close();
try (PDDocument document = PDDocument.load(new File("updated_test2.pdf"))) {
PDPageTree pdPages = document.getDocumentCatalog().getPages();
PDFRenderer pdfRenderer = new PDFRenderer(document);
int page = 0;
for (PDPage pdPage : pdPages) {
String fileName = "demo" + page + ".png";
File tempImg = new File(fileName);
BufferedImage bim = pdfRenderer.renderImage(page);
ImageIOUtil.writeImage(bim, tempImg.getAbsolutePath(), 150);
page++;
}
} catch (Exception e) {
e.printStackTrace();
}
非常感谢您及时的帮助!
这已在底部的 PDFBOX-4801 and a snapshot build is available here 中修复。
它将在 2.0.20 中发布,可能会在夏季发布(希望如此)。
原因是 CMYK ICC 配置文件字典中的 /N 值 (3) 不正确。正确的值应该是 4。这会导致稍后提到的异常。 corrected code 检查 ICC 配置文件并更正 PCICCBased 对象的值。