2011-07-26 7 views
10

Tôi có tệp PDF là đầu ra từ bộ xử lý OCR, bộ xử lý OCR này nhận dạng hình ảnh, thêm văn bản vào pdf nhưng ở vị trí cuối cùng có hình ảnh chất lượng thấp thay vì bản gốc. làm điều đó, nhưng họ làm).Làm cách nào để xóa tất cả hình ảnh/bản vẽ khỏi tệp PDF và chỉ để văn bản trong Java?

Vì vậy, tôi muốn nhận tệp PDF này, xóa luồng hình ảnh và để nguyên văn bản, để tôi có thể lấy và nhập (sử dụng tính năng nhập trang iText) thành PDF tôi đang tạo hình ảnh.

Và trước khi ai đó hỏi, tôi đã cố gắng sử dụng công cụ khác để trích xuất tọa độ văn bản (JPedal) nhưng khi tôi vẽ văn bản trên tệp PDF, nó không ở vị trí giống với văn bản gốc.

Tôi muốn thực hiện điều này trong Java, nhưng nếu một công cụ khác có thể làm tốt hơn, hãy cho tôi biết. Và nó có thể được loại bỏ hình ảnh chỉ, tôi có thể sống với một PDF với các bản vẽ trong đó.

+0

Trong định dạng gì là những hình ảnh? – Seitaridis

+0

JPEG. TIFF, GIF và PNG. –

Trả lời

14

Tôi đã sử dụng Apache PDFBox trong tình huống tương tự.

Để cụ thể hơn một chút, hãy thử một cái gì đó như thế:

import org.apache.pdfbox.exceptions.COSVisitorException; 
import org.apache.pdfbox.exceptions.CryptographyException; 
import org.apache.pdfbox.exceptions.InvalidPasswordException; 
import org.apache.pdfbox.pdmodel.PDDocument; 
import org.apache.pdfbox.pdmodel.PDDocumentCatalog; 
import org.apache.pdfbox.pdmodel.PDPage; 
import org.apache.pdfbox.pdmodel.PDResources; 
import java.io.IOException; 

public class Main { 
    public static void main(String[] argv) throws COSVisitorException, InvalidPasswordException, CryptographyException, IOException { 
     PDDocument document = PDDocument.load("input.pdf"); 

     if (document.isEncrypted()) { 
      document.decrypt(""); 
     } 

     PDDocumentCatalog catalog = document.getDocumentCatalog(); 
     for (Object pageObj : catalog.getAllPages()) { 
      PDPage page = (PDPage) pageObj; 
      PDResources resources = page.findResources(); 
      resources.getImages().clear(); 
     } 

     document.save("strippedOfImages.pdf"); 
    } 
} 

Đó là nghĩa vụ phải loại bỏ tất cả các loại hình ảnh (png, jpeg, ...). Nó sẽ hoạt động như sau:

Sample article http://s3.postimage.org/28f6boykk/before.jpg.

+0

Xin chào @IceGlow, như tôi đã giải thích trước đây, tôi có thể trích xuất văn bản bằng cách sử dụng JPedal, nhưng đó không phải là những gì tôi đang tìm kiếm, tôi muốn xóa các luồng hình ảnh khỏi tài liệu PDF. Hãy tưởng tượng nó giống như cố gắng để loại bỏ tất cả các thẻ từ một tài liệu HTML, nó chỉ là điều này là khá phức tạp để làm với các tập tin PDF. Nhưng nhờ dù sao cho câu trả lời. –

+0

Cảm ơn! Tôi sẽ thử cái này! –

+0

Và nó đã làm nó! Cảm ơn bạn rất nhiều @IceGlow! –

5

Bạn cần phải phân tích các tài liệu như sau:

public static void strip(String pdfFile, String pdfFileOut) throws Exception { 

    PDDocument doc = PDDocument.load(pdfFile); 

    List pages = doc.getDocumentCatalog().getAllPages(); 
    for(int i=0; i<pages.size(); i++) { 
     PDPage page = (PDPage)pages.get(i); 

     // added 
     COSDictionary newDictionary = new COSDictionary(page.getCOSDictionary()); 

     PDFStreamParser parser = new PDFStreamParser(page.getContents()); 
     parser.parse(); 
     List tokens = parser.getTokens(); 
     List newTokens = new ArrayList(); 
     for(int j=0; j<tokens.size(); j++) { 
      Object token = tokens.get(j); 

      if(token instanceof PDFOperator) { 
       PDFOperator op = (PDFOperator)token; 
       if(op.getOperation().equals("Do")) { 
        //remove the one argument to this operator 
        // added 
        COSName name = (COSName)newTokens.remove(newTokens.size() -1); 
        // added 
        deleteObject(newDictionary, name); 
        continue; 
       } 
      } 
      newTokens.add(token); 
     } 
     PDStream newContents = new PDStream(doc); 
     ContentStreamWriter writer = new ContentStreamWriter(newContents.createOutputStream()); 
     writer.writeTokens(newTokens); 
     newContents.addCompression(); 

     page.setContents(newContents); 

     // added 
     PDResources newResources = new PDResources(newDictionary); 
     page.setResources(newResources); 
    } 

    doc.save(pdfFileOut); 
    doc.close(); 
} 


// added 
public static boolean deleteObject(COSDictionary d, COSName name) { 
    for(COSName key : d.keySet()) { 
     if(name.equals(key)) { 
      d.removeItem(key); 
      return true; 
     } 
     COSBase object = d.getDictionaryObject(key); 
     if(object instanceof COSDictionary) { 
      if(deleteObject((COSDictionary)object, name)) { 
       return true; 
      } 
     } 
    } 
    return false; 
} 
+0

Tôi đã cố gắng sử dụng chức năng của bạn sau khi chạy vào cùng một vấn đề với @Pushkar. Tôi không quen thuộc với java và chủ yếu quan tâm đến việc loại bỏ các hình ảnh. Bạn có muốn mở rộng tập lệnh của mình thành một tệp có thể sử dụng được (đặc biệt là chứa tất cả các nhập khẩu cần thiết) không? – Tim

+0

Tính năng này hoạt động! Tải và thay đổi các trang nhanh hơn nhiều. Các tập tin đã không giảm mặc dù (76MB với hình ảnh, 78MB không có hình ảnh). Có cách nào để loại bỏ các hình ảnh mình, để các tập tin trở nên nhỏ hơn một lần nữa? – Tim

+0

Mã này hoạt động. – codin