3

アップデート:

いくつかの議論の後、私たちはTeX、特にWindows互換のMiKTeXを使用することにしました。レイアウトを細かく管理することで動的な長さのテーブルをフォーマットできたとしても(各行の行の高さを計算するのと同じくらい面倒であるとは思えない)、大きなテキストボックスのような他の動的なコントロールもあることに気付きました。マイクロ管理する必要があるため、ドキュメント全体をその場で生成することにしました。そのことを念頭に置いて、TeXに行くことは、そのパワーと以前の経験から当然の選択でした。1週間後、すべてのレポートが動的に生成され、背後のコードがクリーンで、最小限。

オリジナル:

LiveCycleを使用して生成されたpdfフォームテンプレートがあり、それを入力して(pdfstamper)、いくつかのテーブルを追加したい(pdfptable)が、当初考えていたよりも難しいことがわかった。

PDFを開き、pdfstamperを使用して静的フィールドを編集します。

using (var outputPDF1 = new MemoryStream())
{
    var pdfReader = new PdfReader(pdf);
    var pdfStamper = new PdfStamper(pdfReader, outputPDF1);
    var pdfFields = pdfStamper.AcroFields;

    pdfFields.SetField("Field1", "Value1");

これは単純明快です。

次に、設定された場所から複数のページにまたがるテーブルを追加しようとします。ここでは、3年前の、はるかに古いバージョンのitextsharpを使用したこの試みがあり、非常に手動です。

そのコードの要点は、GetOverContentを使用して、生成されたテーブルにColumnTextを挿入することですが、これには、テーブルの高さを認識し、テーブルを手動でサイズにカットする必要があります。

    var cb = pdfStamper.GetOverContent(1);
    var ct = new ColumnText(cb);
    ct.Alignment = Element.ALIGN_CENTER; 
    ct.SetSimpleColumn(36, 36, PageSize.A4.Width-36, PageSize.A4.Height-300); 
    ct.AddElement(table);
    ct.Go();

別の答えがあります Itextsharp: 単一のページテーブルに制限されている正確に1つのページで2つの要素を調整します。拡張可能ですが、後続のページでもヘッダー/フッターを計算する必要があるようです。

そして、同じ一般的な方向でのさまざまな未回答の質問:

動的テーブルをPDFテンプレートに追加する

itextsharpはPdfptableを目的の位置に配置します

だから私の質問は、WYSIWYGエディターを使用して静的にPDFを作成し、それを変更してテーブルや任意の長さのテキストなどの動的なサイズのコンテンツを追加する現在の最良の方法は何ですか?WYSIWYG LiveCycleを使用してテンプレートを機能させることができれば、最初から生成したくありませんが、PDFテンプレート用にフォーマットされたテーブルを取得するのに、すべてをその場で生成するよりも手間がかかる場合は、 itextsharpを使用して、PDF全体をその場で生成します。

4

1 に答える 1

0

まずこれ: フォームをフラット化しないと、コードは機能しません。LiveCycle Designer で作成されたドキュメントでは、PDF は XML のコンテナとして機能します。PdfPTable を使用して PDF 構文を作成できますが、これは XML とは大きく異なります。

次に、コード サンプルでは、​​最初のページの既存のコンテンツの上にテーブルを追加しています。これはあなたの意図ですか?表を含む別のドキュメントを作成してから、ゼロから作成したドキュメントを、入力済みでフラット化されたフォームとマージしてみませんか? 既存のコンテンツがリフローすると想定していますか? その場合は、PDF を理解していないので、もう少し読んでください。

次のコードを使用しているとします。

var cb = pdfStamper.GetOverContent(1);
var ct = new ColumnText(cb);
ct.Alignment = Element.ALIGN_CENTER; 
ct.SetSimpleColumn(36, 36, PageSize.A4.Width-36, PageSize.A4.Height-300); 
ct.AddElement(table);
ct.Go();

表が 1 ページに収まらない場合を除いて、これで問題ない場合は、2 ページ目を挿入してみませんか? 次の行がある例を参照しています。

int status = ct.go(); 

テーブルが列に適合するかどうかを確認するには、ステータスの値を使用する必要があります。テーブルが完全にレンダリングされない限り、ページを挿入し、それらの新しいページにテーブルの一部を追加する必要があります。

もちろん、「ハイブリッド」アプローチを発明するよりも、フォームを適合させた方が、デザインははるかに優れたものになります。

于 2012-09-11T10:06:58.110 に答える