Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java PDFBox-将图像转换为PDF,PDF分辨率_Java_Pdf Generation_Pdfbox_Acrobat - Fatal编程技术网

Java PDFBox-将图像转换为PDF,PDF分辨率

Java PDFBox-将图像转换为PDF,PDF分辨率,java,pdf-generation,pdfbox,acrobat,Java,Pdf Generation,Pdfbox,Acrobat,我使用PDFBOXV2将jpg图像转换为PDF。JPG图像已经在文件系统中了,所以我只需要把它取出来并转换成PDF。下面是我的代码 public void convertImgToPDF(String imagePath, String fileName, String destDir) throws IOException { PDDocument document = new PDDocument(); InputStream in = new FileInp

我使用PDFBOXV2将jpg图像转换为PDF。JPG图像已经在文件系统中了,所以我只需要把它取出来并转换成PDF。下面是我的代码

public void convertImgToPDF(String imagePath, String fileName, String destDir) throws IOException {
        PDDocument document = new PDDocument();
        InputStream in = new FileInputStream(imagePath);
        BufferedImage bimg = ImageIO.read(in);
        float width = bimg.getWidth();
        float height = bimg.getHeight();
        PDPage page = new PDPage(new PDRectangle(width, height));
        document.addPage(page);
        PDImageXObject img = PDImageXObject.createFromFile(imagePath, document);
        PDPageContentStream contentStream = new PDPageContentStream(document, page);
        contentStream.drawImage(img, 0, 0);
        contentStream.close();
        in.close();
        document.save(destDir + "/" + fileName + ".pdf");
        document.close();
    }
这段代码可以很好地进行转换。但是,我在转换的PDF中观察到以下情况

  • 当我打开转换后的PDF时,它的打开速度非常慢(在Acrobat reader中)。看起来PDF正在逐像素打开。如果我打开任何其他PDF,它会打开得很好
  • 对于转换的PDF,acrobat reader中的默认大小显示为较小的值(如15%或24%,附屏幕截图)。尽管它覆盖了100%的屏幕(15%应该意味着我看到的图像要小得多,但事实并非如此)。当我将大小更改为100%时,我看到一个高度模糊的图像,它比实际图像大得多,我必须向左/向右和上/下滚动才能看到完整的图像
  • 这两个观察结果都让我觉得,出于某种原因,生成的PDF的分辨率比它应该的分辨率高得多。这是一个公平的声明吗?如果是,我该如何更正

    编辑 附加正在转换为PDF的JPG图像。当我打开PDF时,它显示了25.9%的大小。这张图片是在iPad上点击的


    有一个重载的
    drawImage()
    方法可以实现这一点

    contentStream.drawImage(PDImageXObject, float x, float y)
    contentStream.drawImage(PDImageXObject, float x, float y, float height, float width)
    
    通过在
    contentStream.drawImage()
    上指定显式宽度和高度,可以实现这一点。例如,如果希望显示的图像小4倍,但仍保持相同的分辨率,可以使用

    scaleDownRatio = 0.25;
    pageSize = PDRectangle.A4;
    
    # this will draw image at bottom left corner
    PDImageXObject pageImageXObject = LosslessFactory.createFromImage(document, bitmap);
    contentStream.drawImage(pageImageXObject, 0, 0, bitmap.getWidth() * ratio, bitmap.getHeight() * ratio)
    
    # to center it you can use something like
    contentStream.drawImage(pageImageXObject, (pageSize.getWidth() - bitmap.getWidth() * ratio) / 2, (pageSize.getHeight() - bitmap.getHeight() * ratio) / 2, bitmap.getWidth() * ratio, bitmap.getHeight() * ratio)
    
    注意:在您的情况下,即使将图像缩放到大小的四分之一,图像也无法容纳;您可以通过以下方式获得比例因子:

    float widthRatio = bitmap.getWidth() / pageSize.getWidth();
    float heightRatio = bitmap.getHeight() / pageSize.getHeight();
    scaleDownRatio = (widthRatio<heightRatio)? widthratio:heightRatio;
    
    float-widthRatio=bitmap.getWidth()/pageSize.getWidth();
    float-heightRatio=bitmap.getHeight()/pageSize.getHeight();
    
    scaleDownRatio=(WidthRatio请共享有问题的图像以再现问题。
    new PDPage(new PDRectangle(宽度、高度))
    不是一个好主意,尺寸以页面单位表示,1个单位=1/72英寸。谢谢@TilmanHausherr,那么我应该用什么来代替呢?我附上了一个JPG示例image@kayasa我已经删除了我之前的评论,它更复杂了,我现在也很困惑。我真的无法回答,但现在我认为,页面大小和图像比例应该分开看。也就是说,1)决定页面大小,2)决定图像显示的比例,使其适合。对于您的示例,由于某些原因,除以3并将图像缩放3效果很好。通过使用
    new PDPage()
    contentStream.drawImage(img,0,0,宽/6,高/6)使用A4纸张大小留下一些空白区域。