2

Apache POI を使用して、Word ドキュメントのプレースホルダーを画像に置き換える必要があります。Apache poi を使用して Word 文書に画像を挿入できます。しかし、プレースホルダーを画像に置き換える方法がわかりません。誰でもこれで助けてもらえますか?

docx4j やその他の API を使用すれば簡単だと思いますが、使用できるのは Apache poi だけです。

4

1 に答える 1

1

それは可能ですが、現在それを達成するには未加工の XML を挿入する必要があると思います。このリンクされた質問「Word文書に画像を挿入する」には基本的な考え方があります。dom4jではなく、POIが必要とするライブラリのみを使用して実行できます。画像を追加する XWPFRun のメソッドのソースを見ると、生の XML も追加しようとしています。しかし、その方法を使用すると、ディスクに書き戻すときにドキュメントが読めなくなります。そのため、XWPFDocument レベル メソッドを使用してドキュメントに画像を追加する必要があります。このメソッドは、画像に対して生成された ID を返します。次に、リンクの例のように、その ID を含む生の XML を実行に追加します。
私たちがこの問題を解決した方法は、代わりにユーザーにテキストの代わりにプレースホルダー画像を Word doc ファイルに挿入してもらうことでした。次に、ドキュメント レベルで挿入する置換画像を追加し、画像のサイズを条件として使用してプレースホルダー画像を含む実行を見つけ、その実行の XML を取得して、スワップインされた新しい画像の ID に置き換えます。プレースホルダーと置換画像が同じサイズである限り、これは機能します。置換後に画像のサイズを調整する必要がある場合は、同じ方法で XML サイズ値を操作できます。Word doc XML 形式の変更の影響を受けにくく、画像に独自の完全な XML を挿入できるため、私たちのソリューションの方が気に入っています。乾杯

    InputStream newImageIS = getImageForCorporation(corporationID);

    String relationID = run.getParagraph().getDocument().addPictureData(newImageIS, Document.PICTURE_TYPE_GIF);
    replaceRunImageData(run, relationID);

private void replaceRunImageData(XWPFRun run, String relationID) {
    CTGraphicalObjectData graph = run.getCTR().getDrawingArray(0).getInlineArray(0).getGraphic()
            .getGraphicData();

    String currentGraphicXML = graph.toString();

    String originalID = RegularExpressionUtil.capture("<a:blip r:embed=\"(\\w+)\"", currentGraphicXML);

    String newXML = StringUtils.replace(currentGraphicXML, originalID, relationID);

    try {
        graph.set(XmlToken.Factory.parse(newXML));
    } catch (XmlException e) {
        throw new RuntimeException(e);
    }

    replaced = true;
}

以下の基準を満たす埋め込み画像の各ランのリストを検索することにより、置き換える画像のランを特定しました。画像の名前を条件として使用してみましたが、プレースホルダー画像をある Word ドキュメントから別の PC 上の別の Word ドキュメントにコピーすると、名前が失われることがわかりました。

private boolean isRunForExistingImage(XWPFPicture pic) {
    if (pic == null || pic.getCTPicture() == null || pic.getCTPicture().getSpPr() == null
            || pic.getCTPicture().getSpPr().getXfrm() == null
            || pic.getCTPicture().getSpPr().getXfrm().getExt() == null) {
        return false;
    }

    long x = pic.getCTPicture().getSpPr().getXfrm().getExt().getCx();
    long y = pic.getCTPicture().getSpPr().getXfrm().getExt().getCy();

    return x == 2066925 && y == 590550;
}
于 2014-08-07T16:29:48.853 に答える