如何使用 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 图像的顶部,这样打印时就不会显示任何内容。或者,如果 CV 包含您的照片或公司徽标,您可以将照片或徽标放在 *.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 字节之中。

在图像中隐藏信息的通用名称是“隐写术”。您可以在线阅读相关内容。这不是一个好例子,因为任何知道您做了什么的人都可以看到原始数据,而无需解密。

我刚刚测试了自己的建议,确实有效。但是,如果你想尝试,你必须在每个步骤中仔细选择要使用(和不使用)的选项,否则图像的文本将变得乱码。

相关内容