如果同一张图片多次包含在 PDF 中,则它只会作为 PDF 对象存储一次。现在我还想将文档中显示的图片附加到 PDF 中,以允许用户复制该文件。我知道有时无论如何都可以从 PDF 中复制图像,但据我所知,这仅限于 PNG 和 JPG 等光栅图像,而对于包含的 PDF 图像/图表则不可能。
我知道像embedfile
和这样的包attachfile
,但棘手的部分是:是否可以显示和附加/嵌入已经使用的图像作为 PDF 附件,而无需将其存储在 PDF 中两次?
或者换句话说,反过来:我喜欢将图像文件添加为 PDF 附件,然后在文档中显示此图像文件,而无需再次存储它。据我所知,PDF 格式应该支持这个,但问题到底如何。我不介意使用一些\pdfobj
代码的解决方案。
这里有一个简单的例子,以便人们可以更好地理解它:
\documentclass{article}
\usepackage{graphicx}
\usepackage{embedfile}
\begin{document}
% Used twice, but only stored once:
\includegraphics[width=\textwidth]{tiger.pdf}
\includegraphics[width=\textwidth,angle=45]{tiger.pdf}
% Also added as attachment:
\embedfile{tiger.pdf}
% This should reuse the image file above, but adds `tiger.pdf` a second time
\end{document}
答案1
我遵循了 Martin Schröder 的想法,使用引用 XObjects。下面是一个例子来说明能以非常有限的方式仅针对嵌入式 PDF 文件进行:
\documentclass{article}
\usepackage{embedfile}
\begin{document}
\embedfile[id={foo}]{tst.pdf}% Embed the file and give it a ID (foo) to refer to it later
Some text
\setbox0=\vbox to 3 in { % Give a message to people who don't see the reference
To see the correct image, please:
0)~ensure you are using Adobe Reader 9.0 or later;
1)~set the preference ``Show reference XObject Targets'' (on the
``Page Display'' tab) to ``Always'';
2)~Add the path of this PDF file to the ``Privileged Locations'' box on the
``Security (Enhanced)'' tab}
\pdfxform attr {/Ref <</F \embedfilegetobject{foo}{Filespec}/Page 0 >>}0
\pdfrefxform\pdflastxform
\end{document}
对于非 PDF 文件,这是不可能的:当文件嵌入 PDF 中时,“嵌入文件流”包含完整的 PNG 文件,包括元数据和其他“块”。当您包含图像进行显示时,只有图像数据本身作为图像数据流(将存在于 PNG IDAT 块中)包含在内,其他信息、元数据等以 PDF 语法表示。我认为没有任何办法可以解决这个问题。
答案2
PDF 规范似乎允许这样做。关键是引用 XObjects(第 8.10.4 节)32000-1:2008)。必须将 PDF 作为嵌入文件包含(第 7.11.4 节),然后构造一个包含/Ref
嵌入文件最少内容的 XObject。您仍然需要为 ref XObject 支付一些开销,并且需要依赖客户端正确处理 ref XObject。
这应该可以通过 pdftex 实现,但可能需要一些技巧\pdfliteral
。