使用 PDFBox 将图像转换为 byte[]

Posted

技术标签:

【中文标题】使用 PDFBox 将图像转换为 byte[]【英文标题】:Converting an image to byte[] by using PDFBox 【发布时间】:2016-04-19 20:28:01 【问题描述】:

我正在使用 PDFBox 2.0。在解析 PDF 文档时,我还想获取第一页作为图像并将其存储到 hbase 以便在搜索结果中使用它(我将创建一个搜索列表页面,如 amazon.com 的搜索页面)。

HBase 接受 byte[] 变量来存储(索引)一个值。我需要将图像转换为 byte[],然后将其存储到 HBase。我已经实现了图像渲染,但是如何将其转换为 byte[]?

        PDDocument document = PDDocument.load(file, "");
        BufferedImage image = null;
        try 
            PDFRenderer pdfRenderer = new PDFRenderer(document);
            if (document.isEncrypted()) 
                try 
                    System.out.println("Trying to decrypt...);
                    document.setAllSecurityToBeRemoved(true);
                    System.out.println("The file has been decrypted in .");
                
                catch (Exception e) 
                    throw new Exception("cannot be decrypted. ", e);
                
            
            PDPage firstPage = (PDPage) document.getDocumentCatalog().getPages().get(0);
            pdfRenderer.renderImageWithDPI(0, 300, ImageType.RGB);
               // 0 means first page.

            image = pdfRenderer.renderImageWithDPI(0, 300, ImageType.RGB);                  
            document.close();

     catch (Exception e) 
            e.printStackTrace();
     

如果我在document.close(); 的正上方写ImageIOUtil.writeImage(image , fileName+".jpg" ,300);,程序会在项目路径中创建一个jpg 文件。我需要把它放在一个 byte[] 数组中,而不是创建一个文件。是否可以?

【问题讨论】:

【参考方案1】:

这可以通过ImageIO.write(Image, String, OutputStream) 来完成,它可以写入任意的OutputStream 而不是磁盘。 ByteArrayOutputStream 可以将输出字节存储到内存中的数组中。

import java.io.ByteArrayOutputStream;
...
// example image
BufferedImage image = new BufferedImage(4, 3, BufferedImage.TYPE_INT_ARGB);

// to array
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ImageIO.write(image, "jpg", bos);
byte [] output = bos.toByteArray();
System.out.println(Arrays.toString(output));

【讨论】:

ByteOutputStream 使用的是什么库?是com.sun.xml.internal.messaging.saaj.util.ByteOutputStream;吗? 我的错,应该是 java.io.ByteArrayOutputStream 这是核心 Java 类,更新答案... 非常感谢。现在我必须考虑如何从 hbase 中获取它并将其显示为搜索列表中的图像。

以上是关于使用 PDFBox 将图像转换为 byte[]的主要内容,如果未能解决你的问题,请参考以下文章

将 Mat 中的 RGB 图像转换为 MFC 中的 BYTE *

在Java代码中使用pdfBox将PDF转换为图片

转换为PNG时,Apache PDFBox删除水平线

如何将 int[] 转换为 byte[]

PDFBox 生成的 PDF 尺寸(高度和宽度)被交换

如何将字节数组转换为图像文件?