首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用PDFBox将JPEG转换为PDF

使用PDFBox将JPEG转换为PDF
EN

Stack Overflow用户
提问于 2016-08-24 19:05:35
回答 2查看 4.1K关注 0票数 2

我确实使用PDFBox版本2.0.2将PDF分割成了JPEG格式的图像。一开始,我只是像这样编写示例代码。

代码语言:javascript
复制
BufferedImage image = pdfRenderer.renderImageWithDPI(pageCounter, 300, ImageType.RGB);

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

我真的很想减少dpi。所以我试了一下,但也不起作用:

代码语言:javascript
复制
PDImageXObject  pdImageXObject = JPEGFactory.createFromImage(doc, bimg, 0.5f, 100);

如何降低DPI?

这是我的源代码:

代码语言:javascript
复制
            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();
    }
}
EN

回答 2

Stack Overflow用户

发布于 2016-08-25 03:38:33

有两个问题:

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

代码语言:javascript
复制
PDPage page = new PDPage(new PDRectangle(width / 300 * 72, height / 300 * 72));

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

代码语言:javascript
复制
float scale = 72 / 300;
contentStream.drawImage(pdImage, 0, 0, pdImage.getWidth()*scale, pdImage.getHeight()*scale);

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

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

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

票数 2
EN

Stack Overflow用户

发布于 2020-03-25 17:41:51

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

代码语言:javascript
复制
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());
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39121590

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档