LuaLaTex、pdfpages、フォントありとフォントなしを区別しますか?

LuaLaTex、pdfpages、フォントありとフォントなしを区別しますか?

私は LuaLaTeX のみを使用しているため、コンパイラ固有の回答でも問題ありません。

このpdfpagesパッケージを使用すると、1 つまたは複数の PDF ページを TeX ドキュメントに含めることができます。ここでは、(コマンドごとに) 1 つの PDF ページのみが含まれる状況に焦点を当てます。含まれているページがドキュメントのサイズに対して大きすぎるという問題はありません。シンプルにしましょう。

含まれている PDF ページは画像であるはずです。必ずしも TeX によって生成されたものではありません。

画像コンテンツのみ (つまり、フォントなし) の PDF ページと、画像コンテンツのみではないページ (埋め込みフォント サブセットを使用してテキストが含まれている場合があります) を区別したいと思います。

含まれている PDF が画像のみの場合は問題ありません。ただし、含まれている PDF に何らかのフォント コンテンツが埋め込まれている場合は、エラー メッセージが表示されて拒否されます。

パッケージpdfpages自体にはこれについて何も記載されていません。依存している にgraphicxもこれについて何も記載されていません。

そこで私の質問は、PDF ページを検査し、フォントのないページとフォントのあるページを区別する簡単な LuaTeX コードはありますか?

知りたい理由: ライセンス上の理由 (Tex の範囲外) により、font-glyph-images は含めることができますが、font-glyph-vectors は含めることができません。私自身は自分で検査できますが、それほど徹底していないユーザーが他にもいるため、ブロックを設定したいと考えています。

私が思うに、答えは 3 つ考えられます。(1) 非現実的な要求なので、忘れてください。(2) LuaTeX で実行できますが、その答えは Lua の専門家にとっては明らかなので、ここに答えを示します。(3) LuaTeX で実行できますが、非常に複雑です。

(3) 私に知らせてください。他の人が私の代わりに仕事をしてくれるとは期待していません。

注: フォント サブセットが埋め込まれていないテキストの可能性は無視できます。

pdffonts編集:コマンドライン プログラムを提案してくれた DG と DC に感謝します。これは、Linux と Windows の両方で動作する Xpdf の一部です。私はすでに両方のプラットフォームでこれを持っていますが、これまで使用したことがありませんでした (または、それについて知りませんでした)。pdffonts大規模なワークフローの一部として既に使用している BASH/Batch スクリプトに組み込むのは、かなり簡単なことです。

pdffonts承認されたシェル エスケープ コマンドのリストに追加しないと TeX 内から呼び出すことはできませんが、これは私の目的には必要ありません。TeX 呼び出しプログラムの代わりに、さまざまなプログラムを呼び出し、前処理された結果に対して lualatex を呼び出して終了するスクリプトがあります。

したがって、これは答えられたものと考えます。

詳細情報: 私が質問した理由は次のとおりです。ご存知のとおり、LaTeX には tiff 画像を含めることはできません。ただし、場合によっては、エンド ユーザーが jpeg ではなく tiff を要求することがあります。たとえば、次のようになります。LaTeXにtif画像を追加する

PDF は「画像形式」を直接保存しません。つまり、PDF 内には tiff や jpeg はありません。代わりに、圧縮方法を持つ Image タイプの XObject があります。したがって、実際に必要なのは、JPEG 圧縮ではなく、非圧縮ストリームまたは Flate デコードのいずれかです。また、画像は CMYK である必要があり、png は除外されます。最後に、PDF は商業印刷用に PDF/X-1a である必要がある場合があります。

ImageMagick と LuaLaTeX を併用すれば、これが可能です。まず、ImageMagick を使用して、カラー プロファイル (インク制限がある場合があります) に従って、RGB イメージを CMYK tiff イメージに変換します。次に、プロファイルが削除され、ImageMagick が tiff を PDF に変換します。次に、を使用して、その PDF を適切なドキュメント クラスに含めますpdfpages。適切なクラス (カスタム) があり、出力 PDF は Adob​​e Acrobat Pro によって検証された PDF/X-1a:2001 に準拠しています。

なぜ単純に jpeg を使用しないのでしょうか? 確かに、その方が手間がかからずうまくいきます。しかし、前述したように、エンドユーザーの中には、独自の理由で jpeg ではなく Flate デコードを要求する人もいます。

さて、なぜフォントについて質問したかというと、ユーザーが画像だけではなくフォントを含む PDF を組み込もうとすると、TeX からは何の異議も出ず、PDF の見栄えも良くなります。しかし、PDF/X-1a であると主張しているにもかかわらず、PDF/X-1a テストに合格しません。この問題を明らかにするフリー ソフトウェアは (私の知る限り) ありません。

これらすべてが機能しています。良さそうです。ただし、付属の PDF が間違っている場合に、他のユーザー (多くの場合、説明を読まないユーザー) に通知されるように、自動テストを追加したいと考えました。

答え1

LuaTeX epdf ライブラリを使用したコマンドライン ツールなしのソリューション:

\documentclass{scrartcl}
\usepackage{luacode,pdfpages}
\begin{luacode*}
function check_for_fonts(name)
  local doc = epdf.open(name);
  if doc == nil then
    tex.sprint(luatexbase.catcodetables['latex-package'],
        "\\errmessage{Could not open " .. name .. "}{}{}\\@gobbletwo")
    return;
  else
    for pageno=1,doc:getNumPages() do
      local fonts = doc:getCatalog():getPage(pageno):getResourceDict():lookup("Font");
      if not fonts:isNull() and fonts:dictGetLength() ~= 0 then
        tex.sprint(luatexbase.catcodetables['latex-package'], '\\@firstoftwo')
        return;
      end
    end
  end
  tex.sprint(luatexbase.catcodetables['latex-package'], '\\@secondoftwo')
  return;
end
\end{luacode*}
\newcommand\PDFHasFontTF[1]{\directlua{check_for_fonts("\luaescapestring{#1}")}}
\begin{document}
\PDFHasFontTF{some_file.pdf}{%
  \errmessage{some_file.pdf contains fonts!}%
}{%
  \includepdf[pages=-]{some_file.pdf}%
}
\end{document}

関連情報