0

100 万 (1 ページ) の PDF ドキュメントを印刷する Java バッチ ジョブがあります。このバッチ ジョブは 5 日ごとに実行されます。

バッチジョブで100万(1ページ)のPDF文書を印刷する場合、どの方法が良いですか?

この PDF では、ほとんどのテキスト/段落がすべての顧客について同じであり、データベースから動的に選択される情報はごくわずかです (顧客 ID/名前/期日/有効期限/金額)。

私たちは次のことを試しました

1) ジャスパーレポート

2) iText

ただし、各ドキュメントの静的テキスト/段落は常に実行時に作成されるため、上記の 2 つの方法ではパフォーマンスが向上しません。

だから私はいくつかのアプローチを考えています

動的な値 (顧客 ID/名前/期日/有効期限/金額) のプレースホルダーを含むテンプレートがあります。

このテンプレートを持つ Open Office のような Communication Server があります。

Web サーバーにデプロイされた Java アプリケーションを介して、データベースからデータセットを取得し、この通信サーバーに渡します。テンプレートは既にメモリに開かれており、データセットから動的プレースホルダー値が変更され、テンプレートは「名前を付けて保存」コマンドのように保存されます。

この上記のアプローチは達成可能でしょうか? はいの場合、どの API / 通信サーバーが優れていますか?

参考までにジャスパーレポートコードはこちら

InputStream is = getClass().getResourceAsStream("/jasperreports/reports/"+reportName+".jasper" );    
JasperPrint print = JasperFillManager.fillReport(is, parameters, dataSource);    
pdf = File.createTempFile("report.pdf", "");
JasperExportManager.exportReportToPdfFile(print, pdf.getPath());
4

3 に答える 3

2

わお。5 日ごとに 100 万件の PDF ファイル。

PDF ファイルを最初から最後まで (ディスク上の完成したファイル) 生成するのに 0.5 秒しかかからないとしても、この量の PDF を連続して生成するには 5 日かかります。

1 秒未満の時間でファイルを生成するアプローチは問題ないと思います (Jasper レポートは確かにこのレベルのパフォーマンスを提供できます)。

プロセス全体をどのように最適化するかを考える必要があると思います。この量のファイルを合理的な時間 (少なくとも一晩)。

于 2012-08-27T07:00:06.867 に答える
1

私はPDFフォームを使用します(これは「高速」である必要があります):

public final class Batch
{
    private static final String FORM = "pdf-form.pdf"

    public static void main(final String[] args) {
        final PdfPrinter printer = new PdfPrinter(FORM);
        final List<Customer> customers = readCustomers();

        for(final Customer customer : customers) {
            try {
                printer.fillAndCreate("pdf-" + customer.getId(), customer);
            } catch (IOException e) {
                // handle exception
            } catch (DocumentException e) {
                // handle exception
            }
        }

        printer.close();
    }

    private @Nonnull List<Customers> readCustomers() {
        // implements me
    }

    private Batch() {
        // nothing
    }
}

public class PdfPrinter implements Closable
{
    private final PdfReader reader;

    public PdfPrinter(@Nonnull final String src) {
        reader = new PdfReader(src); // <= this reads the form pdf
    }

    @Override 
    public void close() {
        reader.close();
    }

    public void fillAndCreate(@Nonnull final String dest, @Nonnull final Customer customer) throws IOException, DocumentException {
        final PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); // dest = output
        final AcroFields form = stamper.getAcroFields();
        form.setField("customerId", customer.getId());
        form.setField("name", customer.getName());
        // ...
        stamper.close();
    }
}

参照: http: //itextpdf.com/examples/iia.php?id = 164

于 2012-08-27T06:46:53.573 に答える
0

いくつかのポスターが述べたように、100万のPDFファイルは、1秒あたり2ドキュメントを超える速度を維持する必要があることを意味します。これは純粋なドキュメント生成の観点からは達成可能ですが、クエリを実行し、データをコンパイルするシステムの負荷もかなりの負荷を受けることに注意する必要があります。また、PDFについては何も言っていません。1ページのPDFは、40ページのPDFよりもはるかに簡単に生成できます...

私はiTextとDocmosisが毎秒数十のドキュメントを達成するのを見たので、Jasperや他のテクノロジーもおそらくそうすることができました。Docmosisについては、あなたが言及した手法(メモリにロードされたテンプレートの入力)に沿って機能するため、言及します。私はDocmosisを製造している会社で働いていることに注意してください。

まだ行っていない場合は、ハードウェア/ソフトウェアアーキテクチャを検討し、必要なパフォーマンスが得られることを確認するために、試行しているテクノロジを試してみる必要があります。おそらく、ピーク負荷は平均負荷よりもいくらか高い可能性があります。

幸運を。

于 2012-09-17T09:16:45.090 に答える