2016-12-29 50 views
-4

請幫助我,我的代碼從PDF文件中提取圖片,並不是從所有PDF文件中提取圖片。雖然它適用於某些PDF文件。請幫幫我。 這裏是我的代碼: ExtractImages.java我的代碼不是從所有PDF文件中提取圖片

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這是不工作是http://www.filedropper.com/lcdpfexample23

請幫助在此先感謝

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格式文件的鏈接。

+1

分享您的pdf文件。如果您的問題是關於iText,請不要在pdfbox中標記您的問題。 –

+2

只是說「我的代碼有時無法工作」併發布未註釋的代碼並不好,因爲您正在尋求幫助。你有什麼想法,你的問題發生?你的日誌是否包含任何信息?你的代碼是否完成沒有錯誤?等等 –

+2

我的猜測是,OP或者將矢量圖像誤認爲光柵圖像(他的代碼只能提取* Image XObjects *),或者他遇到了iText不支持的圖像(我不確定,但我認爲提取JBIG2不支持;你可以用iText將JBIG2轉換爲PDF,但我認爲沒有回頭)。 –

回答

1

OP共享的示例文檔「LC DPF示例2.3.pdf」既不包含位圖圖像也不包含文本。它只包含矢量圖形。

E.g.我們在第一行的「第3頁」中讀到的字母「P」實際上是用這些(m)ove,(l)ine,(c)urve,close(h)和(六)病的指令:

71.16 804.07 m 
71.16 806.83 l 
72.12 806.83 l 
72.72 806.83 73.2 806.83 73.56 806.83 c 
73.8 806.95 74.04 807.07 74.28 807.19 c 
74.52 807.43 74.76 807.67 74.88 807.91 c 
75 808.27 75.12 808.63 75.12 809 c 
75.12 809.59 75 810.07 74.76 810.43 c 
74.4 810.79 74.04 811.03 73.68 811.15 c 
73.44 811.15 72.84 811.27 72 811.27 c 
69.72 811.27 l 
69.72 804.07 l 
71.16 804.07 l 
h 
71.88 810.07 m 
72.36 810.07 72.72 809.95 72.84 809.95 c 
73.08 809.95 73.32 809.83 73.44 809.71 c 
73.56 809.47 73.68 809.23 73.68 809 c 
73.68 808.75 73.56 808.63 73.56 808.51 c 
73.44 808.27 73.2 808.15 73.08 808.15 c 
72.84 808.03 72.48 808.03 71.88 808.03 c 
71.16 808.03 l 
71.16 810.07 l 
71.88 810.07 l 
h 
f 

因此,RenderListener接口的OP工具不會找到任何東西(因爲它僅僅就是監聽位圖圖像和文本)。

他可以實現ExtRenderListener,它還額外偵聽路徑創建和渲染指令。不幸的是,這隻會給他等同於上面的指示,而不是像「這個填充的路徑看起來像一個字母'P'」的解釋。

因此,他要麼必須自己實現這樣的字符路徑識別,要麼使用OCR。