埋め込みフォント サブセットの名前が同じであるが、これらのサブセットの実際の内容が異なる (異なるグリフ セットを含む)場合に、これが起こるのを見てきました。
すべての入力ファイルで、使用されているフォントを確認してください。これには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 でより適切に機能するかどうかをテストできます。
この問題を回避するためにできること
サブセットではなく、常にフルセットとしてフォントを埋め込むようにしてください:
- 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 がすべてのフォントを完全に埋め込まないのはなぜですか?」という質問に対するこの回答を参照してください。詳細については。
個々の入力ファイルを他の人が見たり、印刷したり、使用したりできないことが確実な場合にのみ、次のことを行ってください。
- 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 がすべてのフォントを完全に埋め込まないのはなぜですか?」という質問に対するこの回答を参照 してください。詳細については。
Ghostscript は使用せず、pdftk
PDF の結合に使用してください。 pdftk
PDFのマージに関しては、Ghostscript(少なくとも古いバージョンのpdftkはそうです)よりも「愚かな」ユーティリティであり、この愚かさは利点になる可能性があります...
アップデート
もう一度答えますが、今回はより明示的に (以下のコメントで @sacohe の追加の質問に従います。すべてではない)多くの場合、次の手順が機能します。
結果の出力 PDF は、入力 PDF が異なるフォント (サブセット) に同じ名前のプレフィックスを使用した場合でも、フォント名に異なる (一意の) プレフィックスを使用する必要があります。
この手順は、元の質問の作成者である「Mr R」から提供された元の入力ファイルのサンプルを処理したときに機能しました。その修正の後、最終結果 (修正された入力ファイルから作成されたマージされた PDF) で「文字のスキップの問題」がなくなりました。