23

水平方向の改ページでテーブルをレンダリングできる Java 用の (できればオープンソースの) PDF レイアウト エンジンを知っている人はいますか? 「水平改ページ」は、少なくとも BIRT での機能の命名方法ですが、明確にするために、テーブルの列が多すぎて使用可能なページ幅に収まらない場合、テーブルを複数のページに水平に分割する必要があります。 10 列のテーブル。列 1 ~ 4 が最初のページに出力され、列 5 ~ 10 が 2 ページ目に出力されます。表の行数が多すぎて 1 ページに垂直方向に収まらない場合は、もちろん、次のページでもこれを繰り返す必要があります。

これまで、商品を探すのはなかなか大変でした。このような機能は、他の製品では別の名前が付けられている可能性があり、おばさん Google を使用して適切な解決策を見つけるのが難しくなっていると思います。

これまでのところ、私は試しました:

  • BIRT はこれをサポートしていると主張していますが、実際の実装は非常にバグが多く、使用できません。このような機能については、すべてのページで行の高さが一定に保たれ、ページを隣り合わせに配置するときに行を揃えることができることは自明のことですが。ただし、BIRT は必要な行の高さをページごとに個別に計算します。

  • ジャスパーにはサポートがありません。

  • Apache FOP も検討しましたが、XSL-FO 仕様にはこれに適した構文が見つかりません。

  • いずれにせよ、iText は通常、このタスクには少し「低レベル」すぎます (目的の PDF ドキュメントの他の部分をレイアウトするのが難しくなります) が、サポートを提供していないようです。

他にも数十のレポーティングまたはレイアウト エンジンがあり、適合する場合も適合しない場合もあり、何を探すべきかを正確に推測するのは少し難しいと思うので、おそらく誰かがすでに同様の要件を持っていて、少なくとも正しい方向への提案。製品を Java サーバー アプリケーションに簡単に統合できることが比較的重要です。ネイティブ Java ライブラリが理想的です。

期待されるレイアウト

ここで、行をすべてのページで整列させるには、行の高さを次のように計算する必要があります。

Row1.height = max(A1.height, B1.height, C1.height, D1.height)
Row2.height = max(A2.height, B2.height, C2.height, D2.height)

BIRTは現在、次のようなことをしているようです:

Page1.Row1.height = max(A1.height, B1.height)
Page2.Row1.height = max(C1.height, D1.height)
Page1.Row2.height = max(A2.height, B2.height)
Page2.Row2.height = max(C2.height, D2.height)

2 番目のレイアウト

4

5 に答える 5

1

ここでは Dev Blanked と同じ考えですが、wkhtmltopdf ( https://code.google.com/p/wkhtmltopdf/ ) といくつかの JavaScript を使用すると、必要なものを実現できます。このフィドルに対して wkhtmltopdf を実行すると、以下に示す結果が得られます (pdf ページのスクリーンショット)。「break-after」クラスは、ヘッダー行のどこにでも配置できます。Java EE Web アプリで wkhtmltopdf サーバー側を使用して動的レポートを生成しますが、パフォーマンスは実際には非常に優れています。

HTML

<body>
        <table id="table">
            <thead>
                <tr><th >Header 1</th><th class="break-after">Header 2</th><th>Header 3</th><th>Header 4</th></tr>
            </thead>
            <tbody>
                <tr valign="top">
                    <td>A1<br/>text<br/>text</td>
                    <td>B1<br/>text</td>
                    <td>C1</td>
                    <td>D1</td>
                </tr>
                <tr valign="top">
                    <td>A2</td>
                    <td>B2<br/>text<br/>text<br/>text</td>
                    <td>C2</td>
                    <td>D2<br/>text</td>
                </tr>
            </tbody>
        </table>
    </body>

脚本

$(document).ready(function() {
    var thisTable = $('#table'),
        otherTable= thisTable.clone(false, true),
        breakAfterIndex = $('tr th', thisTable).index($('tr th.break-after', thisTable)),
        wrapper = $('<div/>');

    wrapper.css({'page-break-before': 'always'});
    wrapper.append(otherTable);
    thisTable.after(wrapper);
    $('tr', thisTable).find('th:gt(' + breakAfterIndex + ')').remove(); 
    $('tr', thisTable).find('td:gt(' + breakAfterIndex + ')').remove(); 
    $('tr', otherTable).find('th:lt(' + (breakAfterIndex + 1) + ')').remove(); 
    $('tr', otherTable).find('td:lt(' + (breakAfterIndex + 1) + ')').remove();

    $('tr', table).each(function(index) {
        var $this =$(this),
            $otherTr = $($('tr', otherTable).get(index)),
            maxHeight = Math.max($this.height(), $otherTr.height());
        $this.height(maxHeight);
        $otherTr.height(maxHeight);      
    });
});

結果の PDF のスクリーンショット

于 2013-04-10T17:28:32.670 に答える
0

私のアドバイスはFOPトランスを使用することです。

ここでは、いくつかの例とその使用方法を見ることができます。

ここでは、fopとテーブルを使用したいくつかの例を見つけることができます。

于 2013-03-18T10:45:54.487 に答える
0

ジャスパーにはサポートがありません。

Jasperのドキュメントによると、次の方法でサポートされています。

  • column break 要素 (つまり、type=column 属性を持つ break 要素)。これは、レポート内の任意の場所に配置できます。
  • グループ/ヘッダーの isStartNewColumn 属性

http://books.google.com.au/books?id=LWTbssKt6MUC&pg=PA165&lpg=PA165&dq=jasper+reports+%22column+break%22&source=bl&ots=aSKZfqgHR5&sig=KlH4_OiLP-cNsBPGJ7yzWPYgH_k&hl=en&sa=X&ei=h_1kUb6Akrec&yvAkrec#yvCdirc&pgを参照してください。 =onepage&q=column%20break&f=false

本当に行き詰まっている場合は、最後の手段として Excel / OpenOffice Calc を使用できます。手動でデータをセルにコピーし、必要に応じて手動でフォーマットし、xls 形式で保存します。次に、Java の apache POI を使用して、必要なデータを動的に入力/置換し、ファイル/PDF に出力します。少なくとも、列と行のフォーマット/ブレーク/マージンなどを非常にきめ細かく制御できます.

于 2013-04-10T06:24:04.483 に答える
0

http://code.google.com/p/flying-saucer/を試しましたか。HTMLをPDFに変換することになっています。

于 2013-03-17T14:44:25.530 に答える