6

Apache POI を使用してドキュメントを pdf に変換しようとしていますが、結果の pdf ドキュメントにはテキストのみが含まれ、画像、テーブルの配置などの書式設定はありません。

表、画像、配置などのすべての書式設定を使用してドキュメントを pdf に変換するにはどうすればよいですか?

これが私のコードです:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.OutputStream;

import com.lowagie.text.Document;
import com.lowagie.text.DocumentException;
import com.lowagie.text.Paragraph;
import com.lowagie.text.pdf.PdfWriter;


import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.extractor.WordExtractor;

import org.apache.poi.hwpf.usermodel.Range;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;


public class demo {
    public static void main(String[] args) {

        POIFSFileSystem fs = null;  
        Document document = new Document();

         try {  
             System.out.println("Starting the test");  
             fs = new POIFSFileSystem(new FileInputStream("Resume.doc"));  

             HWPFDocument doc = new HWPFDocument(fs);  
             WordExtractor we = new WordExtractor(doc);  

             OutputStream file = new FileOutputStream(new File("test.pdf")); 

             PdfWriter writer = PdfWriter.getInstance(document, file);  

             Range range = doc.getRange();
             document.open();  
             writer.setPageEmpty(true);  
             document.newPage();  
             writer.setPageEmpty(true);  

             String[] paragraphs = we.getParagraphText();  
             for (int i = 0; i < paragraphs.length; i++) {  

                 org.apache.poi.hwpf.usermodel.Paragraph pr = range.getParagraph(i);
                 paragraphs[i] = paragraphs[i].replaceAll("\\cM?\r?\n", "");  
                 System.out.println("Length:" + paragraphs[i].length());  
                 System.out.println("Paragraph" + i + ": " + paragraphs[i].toString());  
                 // add the paragraph to the document  
                 document.add(new Paragraph(paragraphs[i]));  
             }  

             System.out.println("Document testing completed");  
         } catch (Exception e) {  
             System.out.println("Exception during test");  
             e.printStackTrace();  
         } finally {  
             // close the document  
             document.close();  
         }  
     }  
 }
4

3 に答える 3

8

当面のタスクは、表、画像、配置などのすべての書式設定を使用して、doc を pdf に変換することです。

独自のコンバーター クラスの作成

すでにWordToXxxConverterApache POI には、WordToFoConverterWordToHtmlConverter、およびWordToTextConverterというクラスがあります。後者は損失が大きすぎて要件の例として使用できない可能性が高いですが、前者の 2 つで十分です。

これらのコンバーター クラスはすべて、単語変換クラスの基本的なフレームワークを提供する共通の基本クラスAbstractWordConverterから派生します。さらに、これらすべてのクラスは*DocumentFacade、具体的なターゲット (または何らかの中間) 形式の作成をラップする一致するクラスを使用します: FoDocumentFacadeHtmlDocumentFacade、またはTextDocumentFacade

したがって、テーブル、画像、配置などのすべてのフォーマットを使用してドキュメントを pdf に変換するタスクを実装するには、そのAbstractWordConverterからコンバーター クラスを派生させ、抽象メソッドを実装するために、3 つの具体的な実装クラスから着想を得てください。他のコンバーター クラスと同様に、まさに PDF ライブラリ固有のコードをクラスに集中させるのPdfDocumentFacadeは良い考えのようです。

簡単に始めて、後でより複雑な詳細を追加したい場合は、最初に多くのWordToTextConverter実装コードを使用することから始めて、少なくとも概念実証レベルで機能するようになったらすぐに、機能を拡張してさらに多くをカバーすることができます。フォーマット情報の。

残念ながら、このコンバーター フレームワークはいくぶん DOM 要素中心です。一見すると、そのコンテキストが DOM 要素であることを利用していないように見えるため、その基本クラスをコピーして、それらの DOM 要素パラメーターをより適切な型またはより適切なジェネリック クラス パラメーターと交換することで回避できる場合があります。

既存の Word から XXX へのコンバーターを既存の XXX から Pdf へのコンバーターと組み合わせて使用​​する

これが複雑すぎる、またはリソースにとって時間がかかりすぎると思われる場合は、別のアプローチを試すことができます。上記の既存のコンバーターのいずれかの出力を、別の Pdf への変換の入力として使用することができます。

既存の変換クラスを使用すると、より早く結果が得られますが、複数ステップの変換は、単一ステップの変換よりも損失が大きくなる傾向があります。決定はあなた次第です。

質問に投稿したコードでは、iText クラスを使用しました。iText は、 iText XML WorkerサブプロジェクトXMLWorkerで提供されるを使用して、特定の制限付きで HTML から PDF への変換をサポートします。古代の iText バージョンには、現在非推奨のクラスもありました。したがって、WordToHtmlConverterを iText と組み合わせて使用​​することは、オプションになる場合があります。HTMLWorkerXMLWorker

あるいは、Apache は XSL FO 処理を PDF に提供します。これをWordToFoConverterの出力に適用することもオプションである場合があります

于 2013-07-25T07:55:26.477 に答える
2

POI (ただし、Java ドメイン内) の代替として、docx4j (私がリード/保守しています) を検討することもできます。

docx ファイルの場合、docx4j は最初に FO に変換し、次に FOP を使用して PDF に変換することで PDF に変換できます。

従来のバイナリ doc ファイル (および docx ファイル) については、高性能の商用ソリューションがあります。http://converter-eval.plutext.com/plutext/converterで試すか、 http://www.plutext.com/m/index.php/products-docx-to-pdfで詳細情報を入手してください。 html

于 2015-09-05T09:08:48.127 に答える