繁体   English   中英

PDFBox:从pdf提取图像到inputstream

[英]PDFBox: extracting images from pdf to inputstream

我正在使用PDFBox从我的pdf(仅包含jpg文件)中提取图像。

由于我将这些图像保存在数据库中,因此我想先将每个图像直接转换为inputstream对象,而不将文件临时放在文件sysem上。 但是,我面临着困难。 我认为这是由于使用image.getPDFStream().createInputStream()正如我在以下示例中所做的那样:

while (imageIter.hasNext()) {
    String key = (String) imageIter.next();
    PDXObjectImage image = (PDXObjectImage) images.get(key);

    FileOutputStream output = new FileOutputStream(new File(
            "C:\\Users\\Anton\\Documents\\lol\\test.jpg"));
    InputStream is = image.getPDStream().createInputStream(); //this gives me a corrupt file
    byte[] buffer = new byte[1024];
    while (is.read(buffer) > 0) {
        output.write(buffer);
    }
}

但这有效:

while (iter.hasNext()) {
    PDPage page = (PDPage) iter.next();
    PDResources resources = page.getResources();
    Map<String, PDXObject> images = resources.getXObjects();
        if (images != null) {
            Iterator<?> imageIter = images.keySet().iterator();
            while (imageIter.hasNext()) {
            String key = (String) imageIter.next();
            PDXObjectImage image = (PDXObjectImage) images.get(key);
            image.write2file(new File("C:\\Users\\Anton\\Documents\\lol\\test.jpg")); //this works however
        }
    }
}

知道如何将每个PDXObjectImage(或我可以获得的任何其他对象)转换为输入流吗?

在PDFBox 1.8中,最简单的方法是使用write2OutputStream(),因此您的第一个代码块如下所示:

while (imageIter.hasNext()) {
    String key = (String) imageIter.next();
    PDXObjectImage image = (PDXObjectImage) images.get(key);

    FileOutputStream output = new FileOutputStream(new File(
            "C:\\Users\\Anton\\Documents\\lol\\test.jpg"));
    image.write2OutputStream(output);
}

高级解决方案,只要您确实确定只有JPEG可以正确显示,即没有不寻常的色彩空间:

while (imageIter.hasNext()) {
    String key = (String) imageIter.next();
    PDXObjectImage image = (PDXObjectImage) images.get(key);

    FileOutputStream output = new FileOutputStream(new File(
            "C:\\Users\\Anton\\Documents\\lol\\test.jpg"));
    InputStream is = image.getPDStream().getPartiallyFilteredStream(DCT_FILTERS);
    byte[] buffer = new byte[1024];
    while (is.read(buffer) > 0) {
        output.write(buffer);
    }
}

第二种解决方案删除了​​除DCT(= JPEG)过滤器之外的所有过滤器。 一些较旧的PDF具有多个过滤器,例如ascii85和DCT。

现在,即使您使用JPEG创建图像,您也不知道PDF创建软件做了什么。 找出图像类型的一种方法是检查图像类型(使用instanceof):

- PDPixelMap => PNG
- PDJpeg => JPEG
- PDCcitt => TIF

另一种方法是使用image.getSuffix()。

PDXObjectImage具有方法write2OutputStream(OutputStream out) ,然后您可以从该方法write2OutputStream(OutputStream out)两个字节数组从输出流中取出。

检查如何将OutputStream转换为InputStream? 用于将OutputStream转换为InputStream。

如果您使用的是PDFBox 2.0.0或更高版本

PDDocument document = PDDocument.load(new File("filePath")); //filePath is the path to your .pdf
PDFRenderer pdfRenderer = new PDFRenderer(document);

for(int i=0; i<document.getPages().getCount(); i++){
    BufferedImage bim = pdfRenderer.renderImage(i, 1.0f, ImageType.RGB); //Get bufferedImage for page "i" with scale 1
    ByteArrayOutputStream os = new ByteArrayOutputStream();
    ImageIO.write(bim, "jpg", os);
    InputStream is = new ByteArrayInputStream(os.toByteArray());
    //Do whatever you need with the inputstream
}
document.close()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM