2013-06-24 49 views
1

我有一組pdf文件,其中包含中歐文字,如č,Ď,Š等。我想將它們轉換爲文本,並且我通過Apache Tika嘗試了pdftotextPDFBox,但總是其中一些未正確轉換。特殊字符不能正確地從PDF轉換爲文本

奇怪的是,同一文本中的同一個字符在某些地方正確轉換,而在其他地方正確轉換!一個例子是pdf

在pdftotext的情況下,我使用這些選項:

pdftotext -nopgbrk -eol dos -enc UTF-8 070612.pdf 

我提卡代碼看起來像這樣:

  String newname = f.getCanonicalPath().replace(".pdf", ".txt"); 
      OutputStreamWriter print = new OutputStreamWriter (new FileOutputStream(newname), Charset.forName("UTF-16")); 
      String fileString = "path\to\myfiles\" 
      try{ 

       is = new FileInputStream(f); 

       ContentHandler contenthandler = new BodyContentHandler(10*1024*1024); 
       Metadata metadata = new Metadata(); 
       PDFParser pdfparser = new PDFParser(); 

       pdfparser.parse(is, contenthandler, metadata, new ParseContext()); 
       String outputString = contenthandler.toString(); 

       outputString = outputString.replace("\n", "\r\n"); 
       System.err.println("Writing now file "+newname); 
       print.write(outputString); 

      }catch (Exception e) { 
       e.printStackTrace(); 
      } 
      finally { 
       if (is != null) is.close(); 
       print.close(); 
      } 

編輯:忘了提,我面臨着同樣的問題當從Acrobat Reader XI轉換爲文本時。

回答

2

那麼除了別的,這個代碼將使用平臺默認的編碼:

PrintWriter print = new PrintWriter(newname); 
print.print(outputString); 
print.close(); 

我建議你使用OutputStreamWriter,而不是包裝一FileOutputStream,並指定UTF-8編碼(因爲它可以編碼所有的Unicode,並且通常得到很好的支持)。

您還應該關閉finally塊中的作者,我可能會將「閱讀」部分與「書寫」部分分開。 (我會避免捕獲Exception,但進入異常處理的細節是有點超出這個答案的點。)

+0

嘿喬恩。感謝你的回答。事實是,我隱藏了一些在字符串級別進行utf8轉換的代碼,即在寫入到PrintWriter之前,但您是正確的,OutputStreamWriter是最好的解決方案。儘管如此,仍然有問題。也許這是由於pdf編碼的一些問題,但我不是pdf專家 –

+0

@YannisP:在使用作家之前你不應該做任何事情 - 如果你這樣做,你幾乎肯定會做錯事,因爲普通的'String'沒有任何編碼(或者它總是UTF-16,取決於你的POV)。如果您正在使用'getBytes'和'String'構造函數進行字符串轉換,請立即停止。 –

+0

好,所以我改成'OutputStreamWriter print = new OutputStreamWriter(new FileOutputStream(newname),Charset.forName(「UTF-16」));'但問題仍然存在。我懷疑這是pdf格式的一個普遍問題,因爲除此之外,Adobe Reader的轉換器的行爲相同。 –