6

wkhtmltopdf で作成された PDF ファイルをマージするために Ubuntu で Ghostscript (バージョン 8.71) を使用すると問題が発生します。

私がたまたま経験する問題は、結合プロセスで一部の文字が失われ、結合された PDF で何も (またはスペース) に置き換えられることです。元の PDF を見ると問題ないように見えますが、マージ後に一部の文字が欠落しています。

数字の 9 や文字 a などの 1 つの欠落した文字は、ドキュメント内の 1 つの場所で失われる可能性がありますが、ドキュメント内の別の場所で正常に表示されるため、表示の問題やフォントの問題ではありません。

私が使用しているコマンドは次のとおりです。

gs \
   -q \
   -dNOPAUSE \
   -sDEVICE=pdfwrite \
   -sOutputFile=/tmp/outputfilename \
   -dBATCH \
    /var/www/documents/docs/input1.pdf \
    /var/www/documents/docs/input2.pdf \
    /var/www/documents/docs/input3.pdf 

これを経験したことがある人、またはそれに対する解決策を知っている人はいますか?

4

3 に答える 3

10

埋め込みフォント サブセットの名前が同じであるが、これらのサブセットの実際の内容が異なる (異なるグリフ セットを含む)場合に、これが起こるのを見てきました。

すべての入力ファイルで、使用されているフォントを確認してください。これにはPoppler のpdffontsユーティリティを使用します。

 for i in input*.pdf; do
     pdffonts ${i} | tee ${i}.pdffonts.txt
 done

各 PDF で使用されているフォント名を探します。

BAAAAA+ArialMT私の理論/賭けは、異なる入力ファイルで使用されている同一のフォント名 (に似た名前) を目にすることです。

BAAAAA+サブセット フォントに使用されるフォント名のプレフィックスはランダムであると想定されています(ただし、公式の仕様ではこれについて明確ではありません)。ただし、アプリケーションによっては、などで始まる予測可能なプレフィックスを使用するものがあります(OpenOffice.org と LibreOffice はこれで有名です)。これは、少なくとも 1 つのサブセット フォントが使用されているすべてのファイルでプレフィックスが使用されることを意味します...BAAAAA+CAAAAAA+ DAAAAA+BAAAAA+

入力ファイルがまったく同じ文字サブセットを使用していないということはよくあります。ただし、同一の名前が使用されていると、Ghostscript はフォントが本当に同じであると考える可能性があります。マージされたPDFを(誤って)「最適化」し、2つのフォントインスタンスのうちの1つだけを埋め込みます(両方とも同じ名前、たとえばBAAAAA+Arial)。ただし、このインスタンスには、他のインスタンスの一部である一部のグリフが含まれていない場合があります。

これにより、マージされた出力で一部の文字が欠落します。

Ghostscript の最近のバージョンでは、フォント処理コードが大幅にオーバーホールされていることを知っています。おそらく、Ghostscript v9.06 (現在までの最新リリース) を試すことで、より幸運になるでしょう。

私はこれをさらに詳細に調査することに非常に興味があります。入力ファイルのサンプル (および GS v8.70 によって提供されるマージされた出力) を提供していただければ、v9.06 でより適切に機能するかどうかをテストできます。

この問題を回避するためにできること

  1. サブセットではなく、常にフルセットとしてフォントを埋め込むようにしてください:

    • wkhtmltopdf を使用しているときに、完全なフォントの埋め込みを制御できるかどうか、またどのように制御できるかはわかりません。
    • Libre/OpenOffice から入力 PDF を生成する場合、運が悪く、それを制御することはできません。
    • Acrobat を使用して入力 PDF を生成する場合は、Distiller 設定でフォント埋め込みの詳細を微調整できます。
    • Ghostscript が入力 PDF を生成する場合、完全なフォント埋め込みを強制するコマンドライン パラメータは次のとおりです。
      gs -o output.pdf -sDEVICE=pdfwrite -dSubsetFonts=false input.file

    一部の種類のフォントは完全には埋め込むことができず、サブセット化するだけです (TrueType、Type3、CIDFontType0、CIDFontType1、CIDFontType2)。「Acrobat Distiller がすべてのフォントを完全に埋め込まないのはなぜですか?」という質問に対するこの回答を参照してください。詳細については。

  2. 個々の入力ファイルを他の人が見たり、印刷したり、使用したりできないことが確実な場合にのみ、次のことを行ってください。

    • wkhtmltopdf を使用するときに、フォントを埋め込まないように制御できるかどうか、またその方法がわかりません。
    • Libre/OpenOffice から入力 PDF を生成する場合、運が悪く、それを制御することはできません。
    • Acrobat を使用して入力 PDF を生成する場合は、Distiller 設定でフォント埋め込みの詳細を微調整できます。
    • Ghostscript が入力 PDF を生成する場合、フォントの埋め込みを防ぐためのコマンドライン パラメータは次のとおりです。
      gs -o output.pdf -sDEVICE=pdfwrite -dEmbedAllFonts=false -c "<</AlwaysEmbed [ ]>>setpagedevice" input.file

    一部のタイプのフォントは完全には埋め込むことができず、サブセット化するだけです (Type3、CIDFontType1)。「Acrobat Distiller がすべてのフォントを完全に埋め込まないのはなぜですか?」という質問に対するこの回答を参照 してください。詳細については。

  3. Ghostscript は使用せず、pdftkPDF の結合に使用してください。 pdftkPDFのマージに関しては、Ghostscript(少なくとも古いバージョンのpdftkはそうです)よりも「愚かな」ユーティリティであり、この愚かさは利点になる可能性があります...


アップデート

もう一度答えますが、今回はより明示的に (以下のコメントで @sacohe の追加の質問に従います。すべてではない)多くの場合、次の手順が機能します。

  • Ghostscript (できれば 9.0x シリーズの最新バージョン) を使用して、入力 PDF ファイルを再「抽出」します。

  • 使用するコマンドは次のとおりです (または類似のコマンド)。
    gs -o redistilled-out.pdf -sDEVICE=pdfwrite input.pdf

結果の出力 PDF は、入力 PDF が異なるフォント (サブセット) に同じ名前のプレフィックスを使用した場合でも、フォント名に異なる (一意の) プレフィックスを使用する必要があります。

この手順は、元の質問の作成者である「Mr R」から提供された元の入力ファイルのサンプルを処理したときに機能しました。その修正の後、最終結果 (修正された入力ファイルから作成されたマージされた PDF) で「文字のスキップの問題」がなくなりました。

于 2012-10-09T20:24:01.873 に答える
1

残念ながら、再処理のトリックは Ghostscript 8.70 (redhat/centos リリース) および Word 2010 から PDF としてエクスポートされたファイル (ABCDEE+すべてにプレフィックスを使用しているようです) では機能しないようです。私のプラットフォーム用のビルド済みバージョンの Ghostscript 9 を見つけることができませんでした。

古いバージョンの pdftk が機能する可能性があると述べています。一部の pdf ファイルが pdftk のコアダンプを引き起こす可能性があるため、pdftk (新しいバージョン) から gs に移行しました。@Kurt、pdftkの古いバージョンを見つけようとすると役立つと思いますか? もしそうなら、どのバージョンをお勧めしますか?

途中でうまくいく別の醜い方法は、使用することです:

-sDEVICE=pdfwrite -dCompatibilityLevel=1.2 -dHaveTrueType=false

フォントをビットマップに変換しますが、ページ上の文字が少し明るくなり(大したことではありません)、テキストを選択しようとすると、約1行の高さがずれます(やや面倒です)。文字は正常に表示されます。コピー/貼り付けにより、テキストにランダムなゴミが表示されます。

(これがコメントになることを望んでいましたが、それはできないと思います。答えは閉じていますか?)

于 2013-01-24T23:41:36.853 に答える