我编写了一个程序来将PDF文件导出为一系列图像,如下所示:
//Load pdf from path(file)
File file = new File("C:\\TEMP\\office\\a.pdf");
RandomAccessFile raf = new RandomAccessFile(file, "r");
byte[] b = new byte[(int) raf.length()];
raf.readFully(b);
ByteBuffer buf = ByteBuffer.wrap(b);
PDFFile pdffile = new PDFFile(buf);
//Get number of pages
int numOfPages = pdffile.getNumPages();
System.out.println(numOfPages);
//iterate through the number of pages
for (int i = 1; i <= numOfPages; i++) {
PDFPage page = pdffile.getPage(i);
//Create new image
Rectangle rect = new Rectangle(0, 0, (int) page.getBBox().getWidth(), (int) page.getBBox().getHeight());
Image img = page.getImage(rect.width, rect.height, rect, null, true, true);
BufferedImage bufferedImage = new BufferedImage(rect.width, rect.height, BufferedImage.TYPE_INT_RGB);
Graphics g = bufferedImage.createGraphics();
g.drawImage(img, 0, 0, null);
g.dispose();
File asd = new File("C:\\TEMP\\office\\img\\Testingx" + i + ".jpg");
if (asd.exists()) {
asd.delete();
}
//Export the image to jpg format using the path C:\TEMP\office\img\filename
ImageIO.write(bufferedImage, "jpg", asd);
}
//Close the buf and other stuffs, which does not affect the image exported
这个程序可以在很多PDF文件中正常工作,但是,当我使用互联网上的各种pdf测试我的程序时,有一个pdf无法像其他人那样准确地导出到图像,我使用的资源列出了下方。
原始PDF链接: 2007_OReilly_EssentialActionScript3.0.pdf
我将使用上面给出的PDF的第7页。
要导出的预期图像:Click here for expected result image
程序完成操作后,生成的图像完全不同。
Click here for Resulting image
正如您所看到的,生成的图像向上移动,一些内容消失,结果图像丢失了pdf中的格式,它没有居中,它向右缩进。
PDFrenderer本身没有问题,如果我们运行PDFrenderer的.jar文件,顶端和格式与原始PDF文件一致。
PDF opened with PDFRenderer in page 7
已知可能的问题:ImageIO不支持CMYK格式,因此,第1页和其他页面涉及使用CMYK格式将无法正确导出。不确定我是对的。
另一个问题:PDFRenderer似乎在阅读第1页时失败了,这可能是由于PDF格式中使用了某些内容,我对此并不了解
二手图书馆:PDFRenderer
您可以从上述链接下载PDF并使用我提供的程序重现问题。
我的问题:我该如何解决这个问题?我的计划有什么问题吗?
答案 0 :(得分:1)
我自己发现了这个问题,我可以修复它。
解释如下
我的JAVA程序不遵循pdf文件中的“X”坐标和“Y”坐标,简单来说,我的程序硬编码了X,Y坐标。在大多数情况下,大多数pdf将像下图一样工作
Most PDF http://img266.imageshack.us/img266/7618/4cl5.png
然而,我提供的pdf不是那种情况,左上角的X坐标不是0,所以作为Y.这就是图像被切断的原因。
简而言之,我的程序将捕获具有矩形形状的PDF屏幕,但是由于上面提供的PDF我找不到左上角的坐标,因此它将捕获屏幕,如下图所示。我的错误是Y坐标没有写在图片中。
Exception PDF http://img12.imageshack.us/img12/9672/plhb.png
通过对程序的以下修改,它将像大多数情况一样工作,它会更好。
Rectangle rect = new Rectangle((int)page.getPageBox().getX(), (int)page.getPageBox().getY(), (int) page.getBBox().getWidth(), (int) page.getBBox().getHeight());
这允许程序从左上角开始“捕获”PDFRenderer提供的整个pdf,这就像我提供的第一个图像一样,即使在从A4到A7的不同页面大小中也能正常工作,我没有'进一步测试,但它的工作原理