2016-05-03 42 views
2

我有一個簡單的JAVA代碼,它使用TIKA庫來獲取PDF文件的元數據,並列出了下面的元數據。如何使用pdfbox訪問所有PDF元數據

提卡代碼:

Metadata metadata = new Metadata(); 
tika.parse(file, metadata); 
String[] metadataNames = metadata.names(); 
for (String name : metadataNames) { 
    System.out.println(name + " : " + metadata.get(name)); 
} 

輸出:

date : 1996-11-19T09:00:46Z 
pdf:PDFVersion : 1.1 
access_permission:modify_annotations : true 
access_permission:can_print_degraded : true 
dcterms:created : 1996-10-22T07:44:27Z 
Last-Modified : 1996-11-19T09:00:46Z 
dcterms:modified : 1996-11-19T09:00:46Z 
dc:format : application/pdf; version=1.1 
title : Test 
Last-Save-Date : 1996-11-19T09:00:46Z 
access_permission:fill_in_form : true 
meta:save-date : 1996-11-19T09:00:46Z 
pdf:encrypted : false 
dc:title : Test 
modified : 1996-11-19T09:00:46Z 
Content-Type : application/pdf 
meta:creation-date : 1996-10-22T07:44:27Z 
created : Tue Oct 22 00:44:27 PDT 1996 
access_permission:extract_for_accessibility : true 
access_permission:assemble_document : true 
xmpTPg:NPages : 64 
Creation-Date : 1996-10-22T07:44:27Z 
access_permission:extract_content : true 
access_permission:can_print : true 
producer : Acrobat Distiller 2.1 for Power Macintosh 
access_permission:can_modify : true 

我使用的是使用PDF箱下面的代碼來獲取元數據,但我不希望指定的元數據鍵,而我想要獲得所有可用的元數據密鑰並遍歷它們。

當使用PDF盒庫時,通用訪問所有元數據鍵/值對的最佳方式是什麼?

public static void main(String args[]) { 
     PDFTextStripper pdfStripper = null; 
     PDDocument pdDoc = null; 
     COSDocument cosDoc = null; 
     File file = new File("test/test.pdf"); 
     try { 

      PDFParser parser = new PDFParser(new FileInputStream(file)); 
      parser.parse(); 
      cosDoc = parser.getDocument(); 
      pdfStripper = new PDFTextStripper(); 
      pdDoc = new PDDocument(cosDoc); 
      pdfStripper.setStartPage(1); 
      pdfStripper.setEndPage(5); 
      String parsedText = pdfStripper.getText(pdDoc); 
      // System.out.println(parsedText); 

      PDDocumentCatalog cat = pdDoc.getDocumentCatalog(); 
      PDMetadata metadata = cat.getMetadata(); 

      if (metadata != null) { 
       System.out.println(metadata.getInputStreamAsString()); 
      } 

      printMetadata(pdDoc); 

    } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 


public static void printMetadata(PDDocument document) throws IOException { 
     PDDocumentInformation info = document.getDocumentInformation(); 
     PDDocumentCatalog cat = document.getDocumentCatalog(); 
     PDMetadata metadata = cat.getMetadata(); 

     System.out.println("Page Count=" + document.getNumberOfPages()); 
     System.out.println("Title=" + info.getTitle()); 
     System.out.println("Author=" + info.getAuthor()); 
     System.out.println("Subject=" + info.getSubject()); 
     System.out.println("Keywords=" + info.getKeywords()); 
     System.out.println("Creator=" + info.getCreator()); 
     System.out.println("Producer=" + info.getProducer()); 
     System.out.println("Creation Date=" + formatDate(info.getCreationDate())); 
     System.out.println("Modification Date=" + formatDate(info.getModificationDate())); 
     System.out.println("Trapped=" + info.getTrapped()); 
     if (metadata != null) { 
      System.out.println("Metadata=" + metadata.getStream()); 
     } 
    } 

輸出:

Page Count=64 
    Title=test 
    Author=null 
    Subject=null 
    Keywords=null 
    Creator=null 
    Producer=Acrobat Distiller 2.1 for Power Macintosh 
    Creation Date=10/22/96 12:44 AM 
    Modification Date=11/19/96 1:00 AM 
Trapped=null 

回答

3

對不起,通過所有元數據值來迭代沒有簡單的方法。你可以去元(對不起),並使用PDDocumentInformation對象的反射和迭代通過獲取,但你也必須處理不同的返回類型。在那個時候,你可能只是硬編碼你上面所做的。

而且,這只是爲PDDocumentInformation對象。

通過XMP(真正有趣的元數據可以存在的地方)瀏覽更加有趣,因爲它可以包含不同的模式(DublinCore,XMPMM等等,請參閱例如Jempbox),甚至包含自定義元數據。

在Tika上,我們試圖使更多的XMP元數據可用(只是添加了XMPMM,並且很快將添加Photoshop)...如果您有任何請求,請let us know

最後,如果您確實開始使用XMP和PDFBox,我建議您在一段時間內使用Jempbox(請參閱this)。

+0

是否有可能直接訪問Tika中的pdfbox對象,這樣它的所有方法都將暴露給任何需要它的人?我在Python中使用tika,並且會喜歡tika,並且喜歡從中訪問pdfbox。 – Johnson

+0

你到底需要做什麼?通過「Python中的tika」,你的意思是你通過tika-server和Python調用tika嗎?或者你使用綁定? –