PDFRenderer - 导出到图像,导出不准确

时间:2013-09-26 03:13:50

标签: java

我编写了一个程序来将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并使用我提供的程序重现问题。

我的问题:我该如何解决这个问题?我的计划有什么问题吗?

1 个答案:

答案 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的不同页面大小中也能正常工作,我没有'进一步测试,但它的工作原理