【发布时间】:2017-05-13 19:26:21
【问题描述】:
请帮助我,我从 PDF 文件中提取图像的代码不是从所有 PDF 文件中提取图像。虽然它适用于某些 PDF 文件。请帮我。 这是我的代码: ExtractImages.java
package pdttotextconvertor;
import java.io.IOException;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
/**
* Extracts images from a PDF file.
*/
public class ExtractImages {
/**
* PDF to extract images from
*/
public static final String SOURCE_PDF = "C:/Latest Maven Code/pdttotextconvertor/src/main/resources/LC DPF example 1.pdf";
/**
* Parses a PDF and extracts all the images.
*
* @param filename the source PDF
* @param destination the directory to save images
*/
public void extractImages(String filename, String destination)
throws IOException, DocumentException {
System.out.println("Processing PDF at " + filename);
System.out.println("Saving images to " + destination);
PdfReader reader = new PdfReader(filename);
PdfReaderContentParser parser = new PdfReaderContentParser(reader);
ImageRenderListener listener = new ImageRenderListener(destination + "/Img%s.%s");
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
parser.processContent(i, listener);
}
reader.close();
}
/**
* Main method.
*
* @param args no arguments needed
* @throws DocumentException
* @throws IOException
*/
public static void main(String[] args) throws IOException, DocumentException {
String sourcePDF = SOURCE_PDF;
String destination = "target/images";
if (args.length > 0) {
sourcePDF = args[0];
if (args.length > 1) {
destination = args[1];
}
}
new ExtractImages().extractImages(sourcePDF, destination);
}
}
ImageRenderListener.java
package scannedPdfConvertor;
import java.io.FileOutputStream;
import java.io.IOException;
import com.itextpdf.text.pdf.parser.ImageRenderInfo;
import com.itextpdf.text.pdf.parser.PdfImageObject;
import com.itextpdf.text.pdf.parser.RenderListener;
import com.itextpdf.text.pdf.parser.TextRenderInfo;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
* Saves images to a directory.
*
* @author mnguyen
*/
public class ImageRenderListener implements RenderListener {
/**
* The directory path to store images.
*/
protected String path;
/**
* Creates a RenderListener that will look for images.
*/
public ImageRenderListener(String path) {
this.path = path;
}
/**
* @see com.itextpdf.text.pdf.parser.RenderListener#beginTextBlock()
*/
public void beginTextBlock() {
}
/**
* @see com.itextpdf.text.pdf.parser.RenderListener#endTextBlock()
*/
public void endTextBlock() {
}
/**
* @see com.itextpdf.text.pdf.parser.RenderListener#renderImage(
* com.itextpdf.text.pdf.parser.ImageRenderInfo)
*/
public void renderImage(ImageRenderInfo renderInfo) {
try {
String filename;
FileOutputStream os;
PdfImageObject image = renderInfo.getImage();
if (image == null) {
return;
}
filename = String.format(path, renderInfo.getRef().getNumber(), image.getFileType());
System.out.println("Writing image to file: " + filename);
os = new FileOutputStream(filename);
os.write(image.getImageAsBytes());
os.flush();
os.close();
} catch (IOException e) {
Logger.getLogger(ImageRenderListener.class.getName()).log(Level.SEVERE, null, e);
}
}
/**
* @see com.itextpdf.text.pdf.parser.RenderListener#renderText(
* com.itextpdf.text.pdf.parser.TextRenderInfo)
*/
public void renderText(TextRenderInfo renderInfo) {
}
}
失效的PDF文件链接是http://www.filedropper.com/lcdpfexample23
请帮助提前谢谢。
【问题讨论】:
-
分享您的 pdf 文件。如果您的问题是关于 iText,请不要使用 pdfbox 标记您的问题。
-
只是说“我的代码有时不起作用”并发布未注释的代码是不好的,因为您是在寻求帮助。您对问题发生的地方有任何想法吗?您的日志是否包含任何信息?您的代码完成时没有错误吗?以此类推
-
我的猜测是 OP 要么将矢量图像误认为光栅图像(他的代码只提取 Image XObjects),要么遇到 iText 不支持的图像(我是不确定,但我认为不支持提取 JBIG2;您可以使用 iText 将 JBIG2 转换为 PDF,但我认为没有退路)。
-
itext 图像提取不支持具有有趣色彩空间的特定图像。
-
这里是 Pdf 文件filedropper.com/lcdpfexample23,我无法从这个 pdf 文件中提取图像和数据。请帮忙。