使用 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 命令行工具。
在 GIMP 中,创建一个 100x100 像素大小的新图像。这将比您的简历纯文本包含更多的字节。如果没有,请使用更大的图像。
用白色填充图像。即使您不在 Windows 上,也可以将其导出为 *.bmp(Windows 位图)。不要使用任何编码,也不要保存颜色信息或其他任何内容。
打开简历的纯文本。在开始前和结束后留一些空格。将所有内容复制到剪贴板。
在十六进制编辑器中打开 *.bmp 图像。在它的序言之后,您将看到许多 FF 字节,即白色。在其中的某个地方,用您粘贴的文本覆盖一堆 FF。保存。
您应该能够在 GIMP 中打开已编辑的 *,bmp,其中文本将显示为随机的暗线。将其导出为 PNG,使用 0 压缩,不保存任何信息(无 Exif 等)。
使用 ImageMagick:mogrify -strip thatimage.png 在 Windows 上:magick mogrify -strip thatimage.png
使用
includegraphics
命令 (packagegraphicx
),将 *.png 图像放在 CV TeX 文件中不显眼的位置。您可以将其缩小,使其更小。您还可以使用该textpos
包将一个空白的白色矩形(图像)放置在 *.png 图像的顶部,这样打印时就不会显示任何内容。或者,如果 CV 包含您的照片或公司徽标,您可以将照片或徽标放在 *.png 的顶部。如果您没有将一张图片放在另一张图片之上,那么 PDF 就有可能符合 PDF/X 或 PDF/A 标准。就 PDF 而言,编辑后的 png 只是一张图片。它不知道里面的文本。如果您将一张图片放在另一张图片之上,那么它(通常)不会符合 PDF/X 或 PDF/A 标准,除非您使用这些标准的最新版本。
*.png 图像使用 PDF 方法存储,而不是“作为 png”。稍后,您可以使用 pdfpages 命令行(Linux)提取它,但请确保将输出指定为 png 格式,而不是默认的 ppm 格式。
在 GIMP 中,打开提取的 png,并转换为 bmp,再次确保没有写入编码或杂散数据。
在十六进制编辑器中打开提取的 bmp,然后发现:您的文本就在那里,隐藏在 FF 字节之中。
在图像中隐藏信息的通用名称是“隐写术”。您可以在线阅读相关内容。这不是一个好例子,因为任何知道您做了什么的人都可以看到原始数据,而无需解密。
我刚刚测试了自己的建议,确实有效。但是,如果你想尝试,你必须在每个步骤中仔细选择要使用(和不使用)的选项,否则图像的文本将变得乱码。