[英]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.