4

Kurt Pfeifle の回答のいくつかを見て、2 つの PDF を 1 つの横に並べて結合するスクリプトを作成しました。

しかし、私の問題は、コードが柔軟でないことです。つまり、一方の PDF が他方の PDF よりも大きいか、別の解像度である場合、出力 PDF (サイド バイ サイド PDF) は悪くなります。

図解すると次のようになります。

Input file: a.pdf
+--------+ 
|        |
|  a     |
|        |
+--------+

Input file: b.pdf
+--------+ 
|        |
|  b     |
|        |
+--------+

Desired output file: compare.pdf
+--------+--------+ 
|        |        |
|   a    |  b     |
|        |        |
+--------+--------+

結合する前に、両方の PDF が同じ通常の A4 サイズの PDF と解像度であることを確認する必要がありますか? 非常に多くのコードとスクリプトを試しましたが、これを理解できません。どうやってやるの?スクリプトは、あらゆる PDF を使用して比較できるように防弾仕様である必要があります。同じサイズでなくても。

私のスクリプトは次のようになり、同じサイズと解像度のいくつかの PDF で動作します。

gswin64c.exe                        ^
          -o c.pdf                  ^
          -sDEVICE=pdfwrite         ^
          -g11690x8270              ^
          -dFIXEDMEDIA              ^
          -dPDFSETTINGS=/prepress   ^
          -r300                     ^
          -c "<</PageOffset [0 0]>>setpagedevice" ^
          -f a.pdf

これにより、次のようなc.pdfが作成されます。

c.pdf
+--------+--------+ 
|        |        |
|   a    | (empty)|
|        |        |
+--------+--------+

次のコマンド:

gswin64c.exe                       ^
          -o left-side-outputs.pdf ^
          -sDEVICE=pdfwrite        ^
          -g11690x8270             ^
          -dPDFSETTINGS=/prepress  ^
          -c "<</PageOffset [0 0]>>setpagedevice" ^
          -f b.pdf

これにより、次のようなleft-side-outputs.pdfが作成されます。

left-side-outputs.pdf
+--------+--------+ 
|        |        |
|   b    | (empty)|
|        |        |
+--------+--------+

次のコマンド:

gswin64c.exe                        ^
          -o right-side-outputs.pdf ^
          -sDEVICE=pdfwrite         ^
          -g11690x8270              ^
          -dPDFSETTINGS=/prepress   ^
          -c "<</PageOffset [596 0]>>setpagedevice" ^
          -f c.pdf

これにより、次のようなright-side-outputs.pdfが作成されます。

right-side-outputs.pdf
+--------+--------+ 
|        |        |
|(empty) |  b     |
|        |        |
+--------+--------+

最後のコマンド:

pdftk left-side-outputs.pdf multistamp right-side-outputs.pdf output compare.pdf

これにより、最終結果のcompare.pdfが作成されます。

Desired output file: compare.pdf
+--------+--------+ 
|        |        |
|   a    |  b     |
|        |        |
+--------+--------+

さまざまなページ サイズの PDF 入力ファイルを処理する方法を理解するのに、専門家が助けてくれることを願っています。

4

2 に答える 2

3

あなたの質問に...

結合する前に、両方の PDF が同じ通常の A4 サイズの PDF と解像度であることを確認する必要がありますか?

...答えは「はい、ページ サイズに関してです。解像度に関してはいいえ (問題ありません)」です。

Ghostscript を使用した PDF ページのスケーリング (1)

サイズが混在する PDF のすべてのページをすべて A4 に拡大縮小するコマンドは次のとおりです。

 gswin64c.exe           ^
     -o all-a4.pdf      ^
     -sDEVICE=pdfwrite  ^
     -g5950x8420        ^
     -dPDFFitPage       ^
     -f input.pdf

これにより、メディアのサイズとコンテンツも同様にスケーリングされます (GS v9.10 でテスト済み)。

パラメータ-dPDFFitPageは常に縦横比を維持します。コンテンツを自動的に回転させて、最適にフィットさせます。「ストレッチ」またはページを一方向にのみにすることはできません。ただし、これは次の方法で実現できます。


[アップデート

この方法について、私が十分に理解できなかった点が 1 つあります。

問題は、入力ファイルからのメディアの縦横比がターゲット メディアのアスペクト比と同じでない場合、ターゲット メディア-dPDFFitPageを完全にはカバーしないということです。

入力メディアが正方形のページ サイズ、500x500ポイントを使用すると仮定します。これを A4 のターゲット サイズ ( -g5950x8420) で処理する-dPDFFitPageと、 は正方形の縦横比を維持し、出力サイズ-g5950x5950のみを生成します。

ただし、-dPDFFitPageどちらも除外することはできません。そうしないと、元の400x400コンテンツが拡大縮小されず、より大きなページにのみ配置さ595x842れ、左下隅に配置されます。

更新終了。]


Ghostscript を使用した PDF ページのスケーリング (2)

すべての PDF ページのコンテンツをそれぞれのサイズの 50% にスケーリングするコマンドは次のとおりです。

 gswin64c.exe                                      ^
     -o 50pc.pdf                                   ^
     -sDEVICE=pdfwrite                             ^
     -c "<</Install {.5 .5 scale}>> setpagedevice" ^
     -f input.pdf

ただし、これによってメディア ボックスが同時にスケーリングされることはありません。

PDF ファイルのすべてのページが同じサイズであることがわかっている場合は、これを使用して A3 PDF を A4 に拡大縮小できます。

 gswin64c.exe                                      ^
     -o A4-50pc.pdf                                ^
     -g5950x8420                                   ^
     -sDEVICE=pdfwrite                             ^
     -c "<</Install {.5 .5 scale} /AutoRotatePages /None>> setpagedevice" ^
     -f A3.pdf

ただし、私の回答の最初のコマンドももちろん機能し、より簡単に使用できます。

A5 -> A4またはA4 -> A3の場合:

                    {1.415 1.415 scale}

A3 -> A4またはA4 -> A5の場合:

                    { .707  .707 scale}

しかし、内容を「伸ばす」こともできるので、ここではもっと面白くなります! 水平方向に 75%、垂直方向に 66% にスケーリングするには、次を使用します。

     -c "<</Install {.75 .666 scale}>> setpagedevice"

LetterA4の間の一種の「液体」スケーリングの場合、これらを使用できます。

  • A4 -> レター:{1.028571 .940617 scale}
  • レター -> A4:{ .972222 1.063131 scale}

上記のすべてについて、-gNNNNxMMMM値を指定できます (出力 PDF の固定ページ サイズを決定します --pdfwriteデバイスのデフォルトの内部解像度である 720 ppi でのピクセル単位の寸法、1 つの PostScript ポイント 10 ピクセルを指定します...) -

値を指定しない場合-gNNNNxMMMM、元のページ サイズが使用されますが (値が混在している場合でも)、そのコンテンツは、指定した倍率でこれらのページに描画されます。

私が今知らないこと:メディアサイズを含む混合サイズのPDFの個々のページを一度に「リキッドスケーリング」する方法...

A4 に基づいて、オールレターとオール A5 の PDF ファイルを比較します。

すべてレター サイズの PDF とすべて A5 の PDF を比較し、最初に両方を A4 に拡大縮小する場合、次のようにします。

「Liquid」-スケール レターから A4:

 gswin64c.exe                                      ^
     -o a4-1.pdf                                   ^
     -sDEVICE=pdfwrite                             ^
     -g5950x8420                                   ^
     -c "<</Install{.972222 1.063131 scale}>>setpagedevice" ^
     -f letter.pdf

「固定」-スケール A5 から A4:

 gswin64c.exe                                      ^
     -o a4-2.pdf                                   ^
     -sDEVICE=pdfwrite                             ^
     -g5950x8420                                   ^
     -c "<</Install{1.415 1.415 scale}>>setpagedevice" ^
     -f a5.pdf

または、代わりに:

 gswin64c.exe          ^
     -o a4-2.pdf       ^
     -sDEVICE=pdfwrite ^
     -g5950x8420       ^
     -dPDFFitPage      ^
     -f a5.pdf

次に、両方の A4 PDF ファイルを比較します....

比較ワークフローの最適化

質問で説明されているように、ワークフローの 1 つのステップを保存することもできます。これがより良いアプローチです。

最初のステップ: 左側を準備します (前と同じ)

A4 入力があり、最終出力は A3 であると仮定します。

 gswin64c.exe                   ^
      -o left-sides.pdf         ^
      -sDEVICE=pdfwrite         ^
      -g11900x8420              ^
      -c "<</PageOffset [0 0]>>setpagedevice" ^
      -f a.pdf

これにより、次が作成されます。

left-sides.pdf
+--------+--------+   ^
|        |        |   |
|        |        |   |
|  a     |(empty) |  595 pt == 5950 pixels
|        |        |   |
|        |        |   |
+--------+--------+   v

<-----1190 pt----->
   == 11900 pixels

2 番目のステップ: 右側を準備します (すべて一度に)

 gswin64c.exe                   ^
      -o right-sides.pdf        ^
      -sDEVICE=pdfwrite         ^
      -g11900x8420              ^
      -c "<</PageOffset [595 0]>>setpagedevice" ^
      -f b.pdf

これにより、次が作成されます。

right-side.pdf
+--------+--------+   ^
|        |        |   |
|        |        |   |
|(empty) |  b     |  595 pt == 5950 pixels
|        |        |   |
|        |        |   |
+--------+--------+   v

<-----1190 pt----->
   == 11900 pixels

3 番目のステップ: 2 つのファイルをpdftk

pdftk right-sides.pdf multistamp left-sides.pdf output compare.pdf

また

pdftk left-sides.pdf multistamp right-sides.pdf output compare2.pdf

これにより、次が作成されます。

compare.pdf
+--------+--------+   ^
|        |        |   |
|        |        |   |
|  a     |  b     |  595 pt == 5950 pixels
|        |        |   |
|        |        |   |
+--------+--------+   v

<-----1190 pt----->
   == 11900 pixels

Crop-/Trim-/Art-/Bleed-Boxes に関する更新

もう一つ。

上記のコマンドが機能していないように見えることがあります。その理由は、PDF が単純に想定された「ページ サイズ」だけでなく、より複雑な設定MediaBox(通常は「ページ サイズ」と見なされるもの) とTrimBoxBleedBoxArtBoxおよび を内部的に使用するためCropBoxです。これらのボックスの正確な説明については、こちらを参照してください...

これらすべてのボックスの値について PDF ファイル (入力と結果または中間結果) をテストするには、次のpdfinfoコマンドを使用します。

pdfinfo -f 1 -l 5 -box a.pdf
pdfinfo -f 1 -l 5 -box b.pdf
pdfinfo -f 1 -l 5 -box right-sides.pdf
pdfinfo -f 1 -l 5 -box left-sides.pdf
pdfinfo -f 1 -l 5 -box compare.pdf

CropBox、 PDF ビューアー (およびプリンター) に、 にあるコンテンツのその部分のみを表示 (または印刷) させます。MediaBoxそれが とは異なるように定義されている場合MediaBox、再スケーリング タスクの邪魔になる可能性があります。Ghostscript が検出されても、Ghostscript によって影響を受けることはありません。

ファイルが正常に処理されても、ビューアではページに同じビューポートが表示されることがあります。

これらのボックスの効果を「無効化」するには、非常に大まかなトリックを使用する必要があります。PDF 内のこれらの文字列の名前をすべて小文字の名前に変更します。コマンドラインで行う方法は次のsedとおりです (Windows では使用できない場合があります)。

cat input.pdf                    \
   | sed 's#CropBox#cropbox#g'   \
   | sed 's#TrimBox#trimbox#g'   \
   | sed 's#BleedBox#bleedbox#g' \
   | sed 's#ArtBox#artbox#g'     \
> disarmed.pdf

または、どういうわけか短いですが、解析するのは簡単ではありません:

sed 's#CropB#cropb#g;s#TrimB#trimb#g;s#BleedB#bleedb#g;s#ArtB#artb#g' \
  in.pdf > out.pdf

Ghostscript はバイナリ ファイル形式であるため、一部のバージョンではsed次のようなエラー メッセージが表示される場合があります。

sed: RE エラー: 不正なバイト シーケンス

この場合、GNU sed などの別のフレーバーを試してくださいgsed...

于 2013-11-15T20:43:13.370 に答える
1

PDF ファイルには解像度が含まれていないため、問題になることはありません。私は通常、Ghostscript で -r を使用しません。PDF ファイルに「そのまま」出力できないコンテンツを画像に変換するためにレンダリングする解像度を指定するだけです。そのコンテンツのサイズや配置には影響しません。

/PageOffset は必要ありません。まったく効果がないと思います (入力が PDF の場合)。

/PDFSETTINGS は使用しません。それを使用することで、すべての種類の既製の設定をインポートしていますが、これらがすべて正確に必要なものであると確信していない限り、デフォルトを使用して個別に変更したいスイッチを切り替える方がはるかに優れています.

/AutoRotatePages=/None を設定することをお勧めします。そうしないと、pdfwrite はテキストの大部分を左に横書きにしようとするからです。

ファイルの 1 つを 2 回変換しています。これを避けるようにしてください。変換が多ければ多いほど、問題が発生する可能性が高くなります。

3 つの Ghostscript 入力すべてでメディア サイズを指定しましたが、そのうちの 2 つで FIXEDMEDIA を指定していません。最初のもの(FIXEDMEDIAを指定する場所)の再処理であるため、おそらく問題ありませんが、2番目のインスタンスはどうですか?

あなたは実際にあなたが経験している問題が何であるかを言いません。また、個々のファイルに見られる問題についても、pdftk を使用してそれらをマージした場合についても言及していません。その情報と、問題を示すいくつかのサンプル ファイルがなければ、これ以上のガイダンスを提供することはできません。

ああ、ついでに、このような n-up 面付けを Ghostscript で直接行うこともできますが、pdftk を使用するよりも多くの作業を行う必要があります。少し努力すれば、Ghostscript の 1 回の呼び出しですべてを実行できるでしょう。

于 2013-11-15T08:35:57.380 に答える