3

今日、docx4j を使い始めました。

外部ソースからのコンテンツを入力して、テーブルを含むドキュメントを正常に作成しました。

このコンテンツには単純なHTMLが含まれています。たとえば、列には次のような文字列が含まれる場合があります。

String content = "Hello&nbsp;<strong>Word</strong><br>";

メソッドを使用してこの文字列を列に入れるとcreateParagraphOfText():

Tc tableCell = factory.createTc();    
tableCell.getContent().add(
    wordMLPackage.getMainDocumentPart().createParagraphOfText(content)
);
tableRow.getContent().add(tableCell);

Word文書でそのままレンダリングされます(予想どおり):

Hello&nbsp;<strong>Word</strong><br>

私が達成しようとしているのは、レンダリングされたHTML をドキュメントに配置して、次の出力を取得することです。

ハローワード


私は StackOverflow と Web を検索し、見つかったほとんどすべての例を試しましたが、情報はかなり断片的です。さらに深く掘り下げる前に、少なくとも正しい方向に進んでいるかどうかを知りたいと思います。

jar を Maven に追加しましたdocx4j-ImportXHTMLが、ドキュメントでは、コンテンツは整形式のXHTMLでなければならないと述べていますが、テキストと HTML が混在しているだけです。

また、それを使用する (少数の) 例の多くは、既存の XML ファイルを取得して docx に変換することで構成されていますが、私は docx を手動で完全に作成することに長けており、HTML を含む単一の文字列をレンダリングするだけで済みます。このモジュールで可能ですか?

他の docx4j モジュール(例: ) があることもxhtmlrenderer確認しましたが、どれが優れているかはわかりません。

反復中にテーブル(のセル)にHTMLのチャンクを追加する正しい手順を誰かが知っていますか?

4

3 に答える 3

3

次の選択肢があります。

  • (X)HTML を自分で docx コンテンツに変換する、または
  • Word に任せる

自分で作成することでより細かく制御でき、最初に Word で docx を開かなくても下流の処理 (PDF への変換など) が機能します。

Word に任せるのは、AlternativeFormatInputPart (altChunk) アプローチです。

私のアドバイスは、可能であれば自分で行うことです。そのためには docx4j-ImportXHTML を使用することをお勧めします。

docx4j-ImportXHTML jar を Maven に追加しましたが、ドキュメントには、テキストと HTML が混在しているのに対し、コンテンツは整形式の XHTML でなければならないと記載されています。

「きちんとした」ライブラリの 1 つを使用して、XHTML に変換できます。これらにはかなりの数があるため、どれを使用し、どのように構成するかはあなた次第です。

HTML を含む単一の文字列をレンダリングするだけで済みます。このモジュールで可能ですか?

ConvertInXHTMLFragment.javaは一例です。

他の docx4j モジュール (xhtmlrenderer など) があることも確認しましたが、どれが優れているかはわかりません。

docx4j-ImportXHTML はそれに依存しています。

于 2015-01-28T22:57:58.063 に答える
1

XHTML の代わりに単純な HTML がある場合、

String content = "Hello&nbsp;<strong>Word</strong><br>";

解決策は、HTML を HTML 要素にカプセル化することです。div:

String content = "<div>" + content + "</div>";

閉じていないボイド要素を手動で置き換えます。例:

content = content.replaceAll("<br>", "<br/>");

この時点で、ラテン語のアクセント (&agrave;など) など、認識されない HTML エンティティに対してエラーが発生する可能性があります。その後、div ではなく、DTD 宣言を使用して HTML ドキュメントでコードを囲むことができます。話の終わり。

作業例:

private void whatever(){

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    pkg = WordprocessingMLPackage.createPackage(PageSizePaper.A4,true);
    factory = Context.getWmlObjectFactory();

    Tbl table = factory.createTbl();
    for (Item item : Items){       
        Tr tableRow = factory.createTr();
        Tc tableCell = factory.createTc();

        /* This is the core of the problem */
        String content = wrapXHTML(item.getContent());
        List<Object> objects = importer.convert(wrapToXHTML(content), null);
        tableCell.getContent().addAll(objects);     
        /* problem solved */

        tableRow.getContent().add(tableCell);
        table.getContent().add(tableRow);
    }        
    pkg.getMainDocumentPart().addObject(table);
    pkg.save(baos);
}

private String wrapXHTML(String content) {
    content = content.replaceAll("<br>", "<br/>");
    /* ... other substitutions ... */

    return dtd + html + head + start + content + end;
}

private final static String dtd = 
                     "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\""
                     + " \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">";
private final static String html = "<html xmlns=\"http://www.w3.org/1999/xhtml\">";
private final static String head = "<head></head>";
private final static String start = "<body><div>";
private final static String end = "</div></body></html>";
于 2015-02-02T13:43:58.437 に答える