将显示的图像附加到 PDF,无需重复存储

将显示的图像附加到 PDF,无需重复存储

如果同一张图片多次包含在 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

相关内容