gpt4 book ai didi

java - PDFBox:从 ​​pdf 中提取图像到输入流

转载 作者:行者123 更新时间:2023-11-30 06:14:11 25 4
gpt4 key购买 nike

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

因为我会将这些图像保存在我的数据库中,所以我想先将每个图像直接转换为输入流对象,而不是将文件临时放置在我的文件系统中。但是,我在这方面遇到了困难。我认为它必须这样做,因为我在以下示例中使用了 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()。

关于java - PDFBox:从 ​​pdf 中提取图像到输入流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30693081/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com