使用PDFBox将图像转换为PDF文件

4

我想将一些图像转换为PDDocument对象,并且不保存到硬件中。如何从这个PDDocument对象获取输入流?

我写的代码如下,出现了“在向流写入数据之前调用Create InputStream”错误。

源代码的部分内容如下:

public ByteArrayOutputStream imagesToPdf(final List<ImageEntity> images) throws IOException {
    final PDDocument doc = new PDDocument();
    
    final int count = images.size();
    InputStream in = null;
    PDPageContentStream contentStream = null;
    final ByteArrayOutputStream baos = new ByteArrayOutputStream();
    try {
        for (int i = 0; i < count; i ++) {
            final ImageEntity image = images.get(i);
            byte[] byteCode = image.getByteCode();

            in = new ByteArrayInputStream(byteCode);
            BufferedImage bi = ImageIO.read(in);

            float width = bi.getWidth();
            float height = bi.getHeight();
            PDPage page = new PDPage(new PDRectangle(width, height));
            doc.addPage(page); 

            PDImageXObject pdImage = PDImageXObject.createFromByteArray(doc, byteCode, null);
            contentStream = new PDPageContentStream(doc, page, AppendMode.APPEND, true, true);
            
            float scale = 1f;
            contentStream.drawImage(pdImage, 0, 0, pdImage.getWidth()*scale, pdImage.getHeight()*scale);
            
            IOUtils.closeQuietly(contentStream);
            IOUtils.closeQuietly(in);
        }

        PDStream ps = new PDStream(doc);
        is = ps.createInputStream();
        IOUtils.copy(is, baos);

        return baos;
    } finally {
        IOUtils.closeQuietly(contentStream);
        IOUtils.closeQuietly(in);
    }
}

将多个图像转换为单个PDF而无需物理存储的想法非常棒。太棒了。 - apr
1个回答

3
new PDStream(doc)

这段话的意思是,doc不会像你想象的那样创建一个对象,从中可以以序列化的形式检索doc。实际上,它所做的是创建一个PDF流对象,该对象属于文档doc

你想要做的只是

doc.save(baos);

@user1737352 很好!那么请将答案标记为已接受(点击其左上角的勾号)。 - mkl
抱歉,由于我的声望不足15,我无法点击其左上角的三角形符号。 - user1737352
2
在这两个三角形下面应该有一个勾号符号,你可以切换为灰色或绿色。 勾号是用于接受答案的,而三角形则是用于投票。 无论您的声誉如何,作为提问者,您都应该能够接受答案。 - mkl
太棒了。你提供了一个好的简单而正确的想法。 - apr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接