如何使用 Latex 在 PDF 中附加和隱藏文件?

如何使用 Latex 在 PDF 中附加和隱藏文件?

使用 LaTeX 嵌入檔案相當容易(例如,請參閱:將連結嵌入到嵌入文件)。

隱藏嵌入檔案也是可能的,並且在 LaTeX 之外相當容易做到(參見,例如:https://blog.didierstevens.com/2009/07/01/embedding-and-hiding-files-in-pdf-documents/

但我幾乎可以肯定,僅使用 Latex 就可以執行相同的操作(即嵌入文件並將其從附件列表中隱藏)...

動機:能夠將 tex 原始碼作為附件包含在內從附件清單中。

有灰鬍子知道這個問題的答案嗎?

答案1

部落格文章中的「隱藏」嵌入文件不是 PDF 標準意義上的嵌入文件,所以問題是您真正想要的是什麼:

如果您只想在生成的 PDF 中包含文件內容,則可以新增 PDF 流:如果您寫入\immediate\pdfobj file{some-filename.tex},文件some-filename.tex將作為流複製到 PDF 中。如果您想在不編寫 PDF 解析器的情況下查看此內容,您可以使用

\documentclass{article}
\pdfobjcompresslevel=0% Don't hide the objects
...
\begin{document}
...
% Disable compression for this one object
{\pdfcompresslevel=0\immediate\pdfobj file{some-filename.tex}}
...
\end{document}

如果您在編輯器中開啟生成的 PDF 文件,您會在某處看到類似以下內容的內容:(第一個數字可能會有所不同)

11 0 obj
<Here comes the content of some-filename.tex>
endobj

該物件在任何 PDF 檢視器中都不可見。

當然,這並不是真正嵌入的。第二次嘗試:嵌入文件,但不要將其列在/EmbeddedFiles.您可以使用

\documentclass{article}
\usepackage{embedfile}
\pdfobjcompresslevel=0% Don't hide the objects
...
\begin{document}
...
{\pdfcompresslevel=0\embedfile{some-filename.tex}}
\makeatletter
\global\let\EmFi@list\empty
\makeatother
...
\end{document}

我再次部分禁用了壓縮,以便您可以在生成的 PDF 中找到該文件。這\global\let\EmFi@list\empty使得embedfile套件忘記了到目前為止的所有文件,因此它們永遠不會被寫入嵌入文件清單中,但/EmbeddedFile仍然會寫入包含文件內容和一些元資料的 PDF 物件。您無法輕鬆地使其可見,因為缺少目錄條目。

如果您嘗試重現您引用的部落格文章並更改 的大小寫/EmbeddedFiles,則必須替換 embedfile 的輸出例程:

\documentclass{article}
\usepackage{embedfile}
\pdfobjcompresslevel=0% Don't hide the objects, otherwise you can't see
                      % /Embeddedfiles, so you also can't change it back
\makeatletter
% The following is mostly copied from embedfile.sty, (C) by Heiko Oberdiek
% But all the errors are propably introduced by me
\def\embedfilefinish{%
  \ifEmFi@finished
    \EmFi@Error{%
      Too many invocations of \string\embedfilefinish
    }{%
      The list of embedded files is already written.%
    }%
  \else
    \ifx\EmFi@list\empty
    \else
      \global\EmFi@finishedtrue
      \begingroup
        \def\do##1##2{%
          (##1)##2%
        }%
        \immediate\pdfobj{%
          <<%
            /Names[\EmFi@list]%
          >>%
        }%
        \pdfnames{%
          % Changed name to make this invalid
          /Embeddedfiles \the\pdflastobj\space 0 R%
        }%
      \endgroup
    \fi
  \fi
}
\makeatother
\begin{document}
...
\embedfile{hidden.tex}
...
\end{document}

答案2

如果您想以迂迴的方式做到這一點:使用 GIMP 圖形程式和 ImageMagick。您還需要能夠從 PDF 中提取圖像:在 Linux 上,嘗試 pdfimages 命令列工具。或嘗試 Xpdf 中的 pdfimages.exe 命令列工具。

  1. 在 GIMP 中,建立一個大小為 100x100 像素的新影像。這將比簡歷的純文字包含更多位元組。如果沒有,請使用更大的圖像。

  2. 用白色填滿影像。即使您不在 Windows 上,也可以將其匯出為 *.bmp(Windows 點陣圖)。不要使用任何編碼,也不保存顏色資訊或其他任何內容。

  3. 打開簡歷的純文字。在開始之前和結束之後放置一些空格。將所有內容複製到剪貼簿。

  4. 在十六進位編輯器中開啟 *.bmp 影像。在其序言之後,您將看到許多FF字節,意思是白色。在其中的某個地方,用貼上的文字覆蓋一堆 FF。節省。

  5. 您應該能夠在 GIMP 中開啟編輯過的 *,bmp,其中文字將顯示為隨機的暗線。將其匯出為 PNG,使用 0 壓縮且不保存任何資訊(無 Exif 等)。

  6. 使用 ImageMagick:mogrify -strip thatimage.png 在 Windows 上:magick mogrify -strip thatimage.png

  7. 使用includegraphics指令(package graphicx),將*.png影像放在CV TeX檔案中不顯眼的地方。您可以將其縮小,甚至更小。您也可以使用該textpos套件在 *.png 圖像頂部放置一個空白的白色矩形(圖像),以便在列印時不顯示任何內容。或者,如果履歷包含您的照片或公司徽標,您可以將照片或徽標放在 *.png 的頂部。

  8. 如果您不將一幅圖像放在另一個圖像之上,則可以使 PDF 滿足 PDF/X 或 PDF/A 的要求。就PDF而言,編輯後的png只是一張圖像。它不知道裡面的文字。如果您將一個圖像放在另一個圖像之上,那麼它(通常)將不符合 PDF/X 或 PDF/A,除非您使用的是這些標準的最新版本。

  9. *.png 影像使用 PDF 方法存儲,而不是“作為 png”。稍後,您可以使用 pdfpages 命令列 (Linux) 提取它,但請務必將輸出指定為 png 格式,而不是預設的 ppm 格式。

  10. 在 GIMP 中,打開提取的 png,然後轉換為 bmp,再次確保沒有寫入編碼或雜散資料。

  11. 在十六進位編輯器中開啟提取的 bmp,您會發現:您的文字就在那裡,潛伏在 FF 位元組之間。

在影像中隱藏訊息的總稱是「隱寫術」。您可以在線上閱讀相關內容。這不是一個很好的例子,因為任何知道你做了什麼的人都可以看到原始數據,而無需解密。

我剛剛測試了我自己的建議,它確實有效。但是,如果您想嘗試,則必須仔細選擇在每個步驟中使用(和不使用)的選項,否則圖像的文字將變成亂碼。

相關內容