0

このコードを完全に理解するのを手伝ってくれる人にスターバックス カードを提供したいと思います。それは私にとって重要です。お時間をいただきありがとうございます!

ローワギー氏の素晴らしい本 (iText in Action, Second Edition) を読み始めました。それは本当によく書かれており、有益です。雇用主からの圧力が高いため、第 6 章にスキップするように強いられています。n-Up コード例を理解することは、今の私にとってかなり重要であり、新しいプログラマーであるため、以下のコードにコメントを付けてみます。質問。

もしよろしければ、お時間を割いて下の私の質問を見て、私がそれを説明するのを手伝っていただければ、それは素晴らしいことです. すべての有益なコメントに感謝します。

public void manipulatePdf(String src, String dest, int pow)

Q: ここで、「pow」変数は、たとえば、pow が 3 の場合、結果の n-up は (2x2x2) 8 になることを示しています。結果の pdf には、「src」PDF の 8 つのコピーが含まれます。これは正しいです?

A:

 throws IOException, DocumentException 
 {
   PdfReader reader = new PdfReader(src);
   Rectangle pageSize = reader.getPageSize(1);

   Rectangle newSize = (pow % 2) == 0 ?
     new Rectangle( pageSize.getWidth(), pageSize.getHeight()) : new Rectangle( pageSize.getHeight(), pageSize.getWidth());

Q: 何が起こっているのかわかりません。私には、モジュラス操作の残りがゼロの場合、新しい長方形が縦向きで作成され、その逆のように見えます。これは正しいです?もしそうなら、理由を聞いてもいいですか?

A:

  Rectangle unitSize = new Rectangle(pageSize.getWidth(), pageSize.getHeight());

  for (int i = 0; i < pow; i++) 
  {
    unitSize = new Rectangle(
    unitSize.getHeight() / 2, unitSize.getWidth());
  }

Q: 上記の「for」ループでは、最終的な pdf サーフェスに圧縮される各 pdf の単位サイズを準備していると思います。getWidth() が 2 で除算されない理由がわかりません。

A:

  int n = (int)Math.pow(2, pow);
  int r = (int)Math.pow(2, pow / 2);
  int c = n / r;

Q: 'n' は、最終的な pdf サーフェスに n'up される pdfPages の数です。ここまでは順調ですよね?

'r' は行数、'c' は列数でしょうか?

So, assuming a 'pow' of 3.. 
n = 8 which means 8 up of the pdf when you'll open up the final pdf?
r = 2 which means there'll be be two rows.
c = 4 which means there'll be four columns. 

A:

  Document document = new Document(newSize, 0, 0, 0, 0);
  PdfWriter writer = PdfWriter.getInstance(document,
  new FileOutputStream(String.format(dest, n)));
  document.open();
  PdfContentByte cb = writer.getDirectContent();
  PdfImportedPage page;
  Rectangle currentSize;
  float offsetX, offsetY, factor;
  int total = reader.getNumberOfPages();

  for (int i = 0; i < total; ) 
  {
    if (i % n == 0) 
    {
      document.newPage();
    }

Q: 上記の「for」ループは、現在の作業ページで所定の nup 数に達するたびに、最終的な pdf に新しいページを追加します。n = 8 の場合、新しいページは i = 8、16、24 などで呼び出されます。

A:

    currentSize = reader.getPageSize(++i);

Q: この行は、ソース PDF に多くのページがあり、すべてのページが同じ PDF ページ サイズを共有しているわけではない状況を説明しています。正しい?

A:

    factor = Math.min(unitSize.getWidth() / currentSize.getWidth(),
                      unitSize.getHeight() / currentSize.getHeight());

Q: min 関数は最小の数値を返します。unitSize が currentSize で除算されるのはなぜですか? ここで私の理解が途切れます。

A:

    offsetX = unitSize.getWidth() * ((i % n) % c)
              +(unitSize.getWidth()
              - (currentSize.getWidth() * factor))/2f;

Q: わかりました。offsetX と offsetY は、pdf ページをより大きな最終的な pdf サーフェスに配置するために使用されます。私は理解しています。プログラマーではない人に計算を英語で説明してもらえますか? これは、各数学演算が何をするかを知っていても、全体像を理解していない場合です。

A:

    offsetY = newSize.getHeight()
              - (unitSize.getHeight() * (((i % n) / c) + 1))
              + (unitSize.getHeight()
              - (currentSize.getHeight() * factor))/2f;

    page = writer.getImportedPage(reader, i);

    cb.addTemplate(page,factor, 0, 0, factor, offsetX, offsetY);
  }
  document.close();
}

この質問が、iText を初めて使用し、このコードの詳細なコード ウォークスルーが必要な他の多くの人に役立つことを願っています。

同様に、否定的で一般的に役に立たないコメントが投稿されないことを願っています.

お時間とご協力ありがとうございました!

4

1 に答える 1