2011-05-19 299 views
6

我試圖從* .doc文檔生成PDF文檔。 直到現在,並感謝stackoverflow我有成功生成它,但有一些問題。在JAVA中使用Apache POI和iText創建Word(DOC)中的PDF

我在下面的示例代碼生成PDF格式沒有格式和圖像,只是文本。 該文檔包含未包含在PDF中的空白和圖像。

下面是代碼:

 in = new FileInputStream(sourceFile.getAbsolutePath()); 
     out = new FileOutputStream(outputFile); 

     WordExtractor wd = new WordExtractor(in); 

     String text = wd.getText(); 

     Document pdf= new Document(PageSize.A4); 

     PdfWriter.getInstance(pdf, out); 

     pdf.open(); 
     pdf.add(new Paragraph(text)); 

回答

2

WordExtractor只是抓住了純文本,沒有別的。這就是爲什麼你看到的只是純文本。

您需要做的是逐個獲取每個段落,然後抓取每個段落,獲取格式並在PDF中生成等效項。

一個選項可能是找到一些將XHTML轉換爲PDF的代碼。然後,使用Apache Tika將您的word文檔轉換爲XHTML(它使用底層的POI,併爲您處理所有格式化的東西),並從XHTML轉換爲PDF。否則,如果您要自己做,請查看Apache Tika中用於解析word文件的代碼。這是如何獲得圖像,格式,樣式等非常好的例子。

+0

我真的無法進入Tika項目來解析文字fils。瞭解解析Word文件的任何其他項目或者如何自行解析它的示例項目/說明。我只需要格式化和圖片旁邊的文字文件中的常規文字。 – Ismet 2011-05-24 15:52:35

+0

Tika應該很容易上手!只需抓住Tika CLI程序並將文件傳遞給它,就可以獲得XHTML。對此感到滿意,然後開始自己調用Java。 – Gagravarr 2011-05-25 11:38:11

11

docx4j包括code用於使用iText從docx創建PDF。它也可以使用POI將文檔轉換爲docx。

曾經有一段時間我們同時支持這兩種方法(以及通過XHTML的PDF),但我們決定專注於XSL-FO。

如果它是一個選項,使用docx4j通過XSL-FO和FOP將docx轉換爲PDF會更好。

使用它,像這樣:

 wordMLPackage = WordprocessingMLPackage.load(new java.io.File(inputfilepath)); 

     // Set up font mapper 
     Mapper fontMapper = new IdentityPlusMapper(); 
     wordMLPackage.setFontMapper(fontMapper); 

     // Example of mapping missing font Algerian to installed font Comic Sans MS 
     PhysicalFont font 
       = PhysicalFonts.getPhysicalFonts().get("Comic Sans MS"); 
     fontMapper.getFontMappings().put("Algerian", font);    

     org.docx4j.convert.out.pdf.PdfConversion c 
      = new org.docx4j.convert.out.pdf.viaXSLFO.Conversion(wordMLPackage); 
     // = new org.docx4j.convert.out.pdf.viaIText.Conversion(wordMLPackage); 

     OutputStream os = new java.io.FileOutputStream(inputfilepath + ".pdf");   
     c.output(os); 

更新2016年7月

由於docx4j 3.3.0的,Plutext的商業PDF渲染器是DOCX轉換爲PDF docx4j的默認選項。您可以嘗試在線演示converter-eval.plutext.com

如果您想使用現有的docx將XSL-FO用於PDF(或Apache FOP支持的其他目標)方法,那麼只需將docx4j-export-FO jar添加到您的類路徑。

無論哪種方式,要將docx轉換爲PDF,您可以使用Docx4J外觀的toPDF方法。

通過iText的代碼舊的docx爲PDF格式可以在https://github.com/plutext/docx4j-export-FO/.../docx4j-extras/PdfViaIText/

1

發現我已成功使用的Apache FOP的「WordML中」文檔轉換爲PDF。 WordML是將Word文檔保存爲xml的Office 2003方式。可以在Web上找到XSLT樣式表,將這個xml轉換爲xml-fo,然後可以通過FOP將其轉換爲PDF(以及其他輸出)。

它與提供的解決方案插件沒有多大差別,只是它不讀取.doc文檔,而docx4j顯然是這樣。如果您的要求足夠靈活,可以將WordML樣式文檔作爲輸入,這可能值得深入研究。

祝您的項目順利! Wim

0

我最近遇到的另一個選擇是使用OpenOffice(或LibreOffice)API(see here)。我一直無法進入,但它應該能夠打開各種格式的文件並以pdf格式輸出。如果你看看這個,讓我知道它是如何工作的!

1

使用OpenOffice/LbreOffice和JODConnector 這也主要適用於.doc到.docx。雖然我還沒有制定出圖形的問題。

private static void transformDocXToPDFUsingJOD(File in, File out) 
{ 
    OfficeDocumentConverter converter = new OfficeDocumentConverter(officeManager); 
    DocumentFormat pdf = converter.getFormatRegistry().getFormatByExtension("pdf"); 
    converter.convert(in, out, pdf); 
} 



private static OfficeManager officeManager; 

@BeforeClass 
public static void setupStatic() throws IOException { 

    /*officeManager = new DefaultOfficeManagerConfiguration() 
     .setOfficeHome("C:/Program Files/LibreOffice 3.6") 
     .buildOfficeManager(); 
     */ 
    officeManager = new ExternalOfficeManagerConfiguration().setConnectOnStart(true).setPortNumber(8100).buildOfficeManager(); 


    officeManager.start(); 
} 

@AfterClass 
public static void shutdownStatic() throws IOException { 

    officeManager.stop(); 
} 

您需要運行LibreOffice作爲serverto進行此項工作。 在命令行中,您可以使用此功能;

"C:\Program Files\LibreOffice 3.6\program\soffice.exe" -accept="socket,host=0.0.0.0,port=8100;urp;LibreOffice.ServiceManager" -headless -nodefault -nofirststartwizard -nolockcheck -nologo -norestore 
相關問題