4

複数のテーブルで構成されるPDFを生成していますが、テーブルサイズがPDFページサイズを超えるかどうかを知るための特定の方法があるかどうかを知りたいです。この情報を使用して、PDFを縦向きモードと横向きモードのどちらで生成するかを決定しています。このサイズを取得することは可能でしょうか?

4

1 に答える 1

2

テーブルサイズがPDFページサイズを超えるかどうかを知る

  • テーブルのサイズは、XHTMLテーブルコンテンツ(行、列、ヘッダー、フッターなど)とCSSドキュメント(幅、高さ、境界線のプロパティ)から決定されます。
  • レンダリングエンジン(ITextRenderer)は、XHTMLをレンダリングされた出力に変換するプロセスの一部として、テーブルサイズと、CSSを適用した後にページに収まるかどうかのみを認識します。
  • したがって、ITextRendererこの情報を照会する場合は、次のことを行う必要があります。

    1. ITextRendererインスタンスを作成し、Document経由でパスインしてから、経由でrenderer.setDocument()CSSを適用するとrenderer.layout()、元のページの向きに基づいてすべてのレイアウト計算が実行されます。
    2. なんらかの方法でクエリを実行して、テーブルがページに収まるかどうかを判断します
    3. そうでない場合は、ポートレート/風景を切り替えます。ただし、これは、新しいCSSに変更し、別のページ形状に設定することを意味します。
      1. 新しいページの向きに適した新しいCSSを選択し、ドキュメント内に設定します
      2. 新しいITextRendererインスタンスを作成し、を介して渡してDocumentからrenderer.setDocument()、を介してCSSを適用します。renderer.layout()これにより、すべてのレイアウト計算が新しいページの向きに基づいて行われます。
      3. を介してPDF出力を作成しますrenderer.createPDF()

問題:

  • これは非効率的でエレガントでない処理です。
  • これは間違った方法で物事を行っています。ページレイアウトの制御は設計プロセスの一部であり、(a)生成されたコンテンツ(XHTML)および(b)フォーマット(CSS)に反映されている必要があります。それが正しく行われていれば、ページ全体を再フォーマットするためにレンダリング時の魔法を使う必要はないはずです。
  • 手順(2)では、テーブルがページ内に収まるかどうかを簡単に通知する単純なクエリインターフェイスはありません。代わりに、フォーマットされた出力ブロックを照会し、テーブルがどこにあるか、およびテーブルがページに収まるかどうかを自分で調べてみる必要があります。例えば:

     BlockBox root = renderer.getRootBox();
     List  pageList = root.getLayer().getPages() 
     PageBox page = (PageBox)pageList.get(2);
     List childBoxList = page.getChildren();
     Box childBox = (Box)childBoxList.get(0);
     // etc... until you locate your table
    
  • ステップ(4)で、ITextRendererは、CSSがXHTMLドキュメント内からリンクされていることを想定しています。つまり、最初にXHTMLソースを変更してから、それをITextRendererに再送信する必要があります。

提案された代替案:

  • 2つのシナリオでワイヤーフレーム/スケッチデザインを行います-1つはポートレート用、もう1つはランドスケープ用です
  • 2つのシナリオで要素/行/列のサイズを決定します
  • 各シナリオ、ポートレートとランドスケープを使用する条件ロジックを決定します。たとえば、行数がXで、列数がYの場合、横向きを使用します...
  • 次に、2つのCSSファイルを作成します
  • これで、XHTMLを生成するときに、条件ロジックを使用して正しいCSSにリンクします
于 2013-07-02T06:26:54.343 に答える