【问题标题】:Convert JPEG to PDF using PDFBox使用 PDFBox 将 JPEG 转换为 PDF
【发布时间】:2016-08-24 11:05:34
【问题描述】:

我确实使用 PDFBox 2.0.2 版将 PDF 拆分为 JPEG 图像。起初,我只是像这样编写示例代码Ö

BufferedImage image = pdfRenderer.renderImageWithDPI(pageCounter, 300, ImageType.RGB);

现在,我想将此图像转换为 PDF,但图像 DPI 太大。

我真的想降低 dpi。所以我尝试了这个,但它也没有工作:

PDImageXObject  pdImageXObject = JPEGFactory.createFromImage(doc, bimg, 0.5f, 100);

如何降低 DPI?


这是我的源代码:

            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));
            
            doc.addPage(page);
            //PDStream stream = new PDStream(doc, in);
            
            PDImageXObject  pdImageXObject = JPEGFactory.createFromImage(doc, bimg, 0.5f, 10);

            PDPageContentStream contentStream = new PDPageContentStream(doc, page);
            
            contentStream.drawImage(pdImageXObject, 0, 0);
            
            contentStream.close();
        }
    } finally { 
        System.out.println("ddd");
        doc.save(pdfPath);
        doc.close();
    }
}

【问题讨论】:

  • 是否要将位图图像本身更改为较低的分辨率?或者您只是想缩放以适应页面?
  • @mkl 我想他想在新的 PDF 中缩放图像。
  • @TilmanHausherr 我想将位图图像本身更改为较低的分辨率,并制作新的 PDF,因为我试图将新的 PDF 渲染为图像,每个尺寸都太大。
  • 为什么不用 72dpi 而不是 300 渲染它呢?在这种情况下 72 / 72 = 1。BufferedImage image = pdfRenderer.renderImageWithDPI(pageCounter, 72, ImageType.RGB);

标签: java pdf pdfbox


【解决方案1】:

有2个问题:

1) 页面大小。它不是以像素为单位,而是以页面为单位。 1 个单位 = 1/72 英寸。所以你的矩形会这样计算:

PDPage page = new PDPage(new PDRectangle(width / 300 * 72, height / 300 * 72));

2) 缩放图像。在 300dpi 时,它必须按 72/300 缩放,因为 1:1 是 72 dpi。

float scale = 72 / 300;
contentStream.drawImage(pdImage, 0, 0, pdImage.getWidth()*scale, pdImage.getHeight()*scale);

顺便说一句,使用 JPEGFactory 不是一个好主意,因为会丢失一些质量。请改用 LosslessFactory。

关于您使用 JPEGFactory 的 dpi 参数 - 这只是元数据。它不会缩放任何东西。

如果您真的想“降低 dpi”,然后以 72 dpi 而不是 300 渲染 PDF,那么在创建新 PDF 时就不需要缩放。

【讨论】:

    【解决方案2】:

    我遇到了类似的问题,我使用以下方法解决了它:

    PDPage page = new PDPage(PDRectangle.A4);
    PDImageXObject pdImage = PDImageXObject.createFromFile(imgFile, doc);
    PDPageContentStream contents = new PDPageContentStream(doc, page, false, false);   
    contents.drawImage(pdImage, 0, 0, PDRectangle.A4.getWidth(), PDRectangle.A4.getHeight());
    

    【讨论】:

    • 看到没有提及图像分辨率:这能解决什么问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-01
    • 2015-09-05
    • 2014-06-13
    相关资源
    最近更新 更多