LuaLaTex、pdfpages,区分with-font和no-font?

LuaLaTex、pdfpages,区分with-font和no-font?

我只使用 LuaLaTeX,因此特定于编译器的答案就可以了。

pdfpages软件包允许我将一个或多个 PDF 页面包含到 TeX 文档中。让我们关注只包含一个 PDF 页面(每个命令)的情况,并且包含的​​页面对于文档尺寸来说太大也没有问题。保持简单。

所包含的 PDF 页面应该是图像。它不一定是由 TeX 生成的。

我想区分仅包含图像内容(即没有字体)的 PDF 页面和不包含图像内容(可能包含一些文本,使用嵌入的字体子集)的页面。

如果包含的 PDF 仅包含图像,则没问题。但如果包含的 PDF 包含任何类型的嵌入字体内容,则会被拒绝并显示错误消息。

软件包pdfpages本身没有提到这一点。它所依赖的graphicx软件包也没有提到这一点。

所以我的问题是:是否有任何简单的 LuaTeX 代码可以检查 PDF 页面,并区分没有字体的页面和有字体的页面?

我为什么想知道:出于许可原因(超出了 Tex 的范围),我可以包括字体字形图像,但不能包括字体字形矢量。虽然我个人可以自己检查,但我有其他用户可能没有那么彻底,我想设置一个块。

我认为有三种可能的答案:(1)不切实际的要求,所以忘了它吧。(2)LuaTeX 可以做到,对于 Lua 专家来说答案是显而易见的,所以这就是答案。(3)LuaTeX 可以做到,但它非常复杂。

如果是 (3) 请直接告诉我;我不指望别人替我做这项工作。

注意:我们可以忽略没有嵌入字体子集的文本的可能性。

编辑:感谢 DG 和 DC 推荐这个pdffonts命令行程序。它是 Xpdf 的一部分,可以在 Linux 和 Windows 上运行。我已经在两个平台上安装了它,但从未使用过它(甚至不知道它)。将它包含pdffonts在我已经用作更大工作流程的一部分的 BASH/Batch 脚本中是一件相当简单的事情。

虽然pdffonts如果不将其添加到已批准的 shell-escape 命令列表中,则无法从 TeX 内部调用它,但这对于我的目的来说并不是必需的。我没有使用 TeX 调用程序,而是使用一个脚本来调用各种程序,然后通过在预处理结果上调用 lualatex 来完成。

因此,我认为这已经得到解答了。

更多信息:这就是我问的原因。众所周知,LaTeX 不能包含 tiff 图像。但在某些情况下,最终用户需要 tiff,而不是 jpeg。例如:将 tif 图像添加到 LaTeX

PDF 不直接存储“图像格式”。也就是说,PDF 中没有 tiff 或 jpeg。相反,有一个 Image 类型的 XObject,带有压缩方法。因此,实际上需要的是未压缩的流或 Flate 解码,而不是 JPEG 压缩;而且,图像可能需要是 CMYK,不包括 png。最后,PDF 可能需要是 PDF/X-1a,用于商业印刷。

可以结合使用 ImageMagick 和 LuaLaTeX 来实现这一点。首先,使用 ImageMagick 根据颜色配置文件(可能有墨水限制)将 RGB 图像转换为 CMYK tiff 图像。然后,剥离配置文件,ImageMagick 将 tiff 转换为 PDF。然后,使用 将该 PDF 包含在合适的文档类中pdfpages。我有合适的类(自定义),并且输出 PDF 符合 PDF/X-1a:2001,经 Adob​​e Acrobat Pro 验证。

为什么不直接使用 jpeg?这确实有效,而且更省力。但正如我所说,一些最终用户出于自己的原因坚持使用 Flate 解码而不是 jpeg。

现在,我为什么要问字体的问题:如果用户尝试在 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}

相关内容