LuaLaTex,pdfpages,區分有字體和無字體嗎?

LuaLaTex,pdfpages,區分有字體和無字體嗎?

我只使用 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 上運行。我已經在兩個平台上都有它,但從未使用過它(甚至不知道它)。將其包含在 BASH/Batch 腳本中是相當簡單的事情pdffonts,我已經將其用作更大工作流程的一部分。

雖然pdffonts如果不將其添加到已批准的 shell 轉義命令列表中就無法從 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 將 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}

相關內容