2011-09-20 156 views
0

我工作中,我加入了這個Maven的依賴關係爲PDFBOX如何修改類文件?

Maven dependency 

    <dependency> 
     <groupId>org.apache.pdfbox</groupId> 
     <artifactId>pdfbox</artifactId> 
     <version>1.6.0</version> 
    </dependency> 

在Eclipse中的項目,我居然也得到了錯誤的某些PDF文件:

Parsing Error, Skipping Object 
java.io.IOException: expected='endstream' actual='' [email protected] 
    at org.apache.pdfbox.pdfparser.BaseParser.parseCOSStream(BaseParser.java:439) 
    at org.apache.pdfbox.pdfparser.PDFParser.parseObject(PDFParser.java:552) 
    at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:184) 
    at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1088) 
    at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1053) 
    at org.apache.tika.parser.pdf.PDFParser.parse(PDFParser.java:74) 
    at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:197) 
    at org.apache.tika.parser.CompositeParser.parse(CompositeParser.java:197) 
    at org.apache.tika.parser.AutoDetectParser.parse(AutoDetectParser.java:135) 
    at org.apache.tika.Tika.parseToString(Tika.java:357) 
    at edu.uci.ics.crawler4j.crawler.BinaryParser.parse(BinaryParser.java:37) 
    at edu.uci.ics.crawler4j.crawler.WebCrawler.handleBinary(WebCrawler.java:223) 
    at edu.uci.ics.crawler4j.crawler.WebCrawler.processPage(WebCrawler.java:460) 
    at edu.uci.ics.crawler4j.crawler.WebCrawler.run(WebCrawler.java:129) 
    at java.lang.Thread.run(Thread.java:662) 

所以,當我谷歌它,我發現在BaseParser.java文件中有一些錯誤,所以他們只給這個java文件的補丁(https://issues.apache.org/jira/browse/PDFBOX-195)..所以我的問題是我怎麼才能修改這個Java文件..我可以看到BaseParser。在eclipse中的類文件,因爲我附加了PDFBOX-Issue的源文件。任何建議將不勝感激。

+0

您所指的問題已在0.8.0中修復,並且您正在使用該庫的版本1.6.0。你確定這個問題與你的異常有關嗎? – stefanglase

+0

確保它實際上是1.6版。0會出現在您的構建項目中,而不是某個較老的項目,可能會將其作爲您的某個模塊的依賴項。 –

回答

0

鑑於BaseParser.java是一個Apache文件,絕對沒有理由不能下載源代碼,進行更改並重新編譯它。我在過去使用過Apache代碼。這很簡單,只花了我幾分鐘。請記住將您的修補程序提交回Apache,以便將其包含在發行版中。

0

您可以:

  • 創建子類,手動(如果有可能使用它)
  • 下載源,修復它,重新編譯,最後,
  • programmaticly創建子類(使用覆蓋它在罐子CGLIB或ASM)
  • 僅下載BasicParser,模擬一切都取決於(剛創建的需求的方法空的類文件),重新編譯,並放在罐子(或./ext在JVM ./endorsed目錄,如果你想)
0

通常,不會直接修改類文件,他們會下載源代碼,然後使用javac重建類文件。是的,可以在不做這樣的事情的情況下修改類文件;但是,補丁文件通常不是二進制補丁文件,它們通常是源代碼補丁文件。

Stefanglase提到您正在使用的版本應該有補丁應用,但最近更改重新引入此問題的可能性很小。在深入研究之前,您可能想驗證您是否解決了錯誤的問題。

關於您真正想要修改二進制文件的罕見幾率,可以使用十六進制編輯器或簡稱hexeditor打開它。基本上,這允許您將文件中的任何字節設置爲任何值,這意味着您必須對文件的內部格式,允許/不允許的內容以及如何進行允許的更改實際實現您的預​​期行爲有深入的瞭解。簡而言之,您將手動執行編譯器的工作。

它可以完成,但這是一類需要大量知識的任務,很少有人擁有這些知識,所以知識的學習和成功實施變化的成本可能遠遠高於重建從可用的補丁源。即使是在已有的一般原則和技術知識的基礎上成功實施變革的成本,也不是一個可以肯定地說明的事情,而是以重建整個圖書館的成本爲補充來源。

祝你好運。