如何将pdf注释从文件资源中分离出来?

如何将pdf注释从文件资源中分离出来?

假设我们有一个附加文件:

\immediate\pdfobj stream file {\jobname.tex}

\pdfannot width 10pt height 10pt depth 0pt {
  /Subtype /FileAttachment
  /FS << /F (file)
  /Type /Filespec
  /EF << /F \the\pdflastobj\space 0 R >> >>}

它通过两种操作附加 - 第一种是一种文件资源,第二种是可见的图像,通过单击我们可以打开文件。

现在假设我们需要将图像放在当前位置。必须附加到该位置的文件由类似以下内容动态形成:

\immediate\openout\fileout=file.tmp\relax
\immediate\write\fileout{some dynamic content}%
\immediate\closeout\fileout

而逐行写入文件的文本也会写入文档。这意味着文本在图像插入之后才可用。

如果我做这样的事情,文档会被正确编译,但 pdf 查看器会崩溃:

\pdfoutput=1

\newcount\fileno \fileno=0
\newwrite\fileout

\pdfannot width 8pt height 8pt depth 0pt {
/Subtype /FileAttachment
/FS <</Type /Filespec /F (test.txt)
/EF <</F \the\fileno\space 0 R>> >> /Name /PushPin}

\immediate\openout\fileout=test.tmp\relax
\immediate\write\fileout{a}%
\immediate\closeout\fileout

\immediate\pdfobj stream file {test.tmp}%
\fileno=\the\pdflastobj

\bye

是否可以将注释指向尚不存在的文件资源,并保证在整个文档结束之前存在?

希望该功能可以与 LuaTeX 兼容。

是否有可能在资源?

编辑

如果我将文件资源放在注释之前,它会抱怨:

! LuaTeX error (ext5): cannot open file for embedding.
l.6 \immediate\pdfobj stream file {test.tmp}

因为 LuaTeX 正在就地附加文件内容。如果可能的话,另一种解决方案是将此操作延迟到文档末尾。

编辑

一些有用的信息来自 http://tug.ctan.org/systems/doc/pdftex/manual/samplepdf/samplepdf.tex

User-defined object can be inserted into the pdf output by \pdfobj. The
object is written out as specified, apart from case when \pdfobj is used with
"stream" option. An object created by \pdfobj is held in memory and will
not be written to the pdf output, unless 1) the object is referenced by
saying \pdfrefobj <object number>; or 2) \pdfobj is preceded by
\immediate. The object number of the last object created by \pdfobj is
accessible via \pdflastobj

答案1

pdfTeX/LuaTeX\pdfobj reserveobjnum提供\pdfobj useobjnum

\pdfoutput=1

\pdfobj reserveobjnum
\edef\fileno{\the\pdflastobj}

\pdfannot width 8pt height 8pt depth 0pt {
/Subtype /FileAttachment
/FS <</Type /Filespec /F (test.txt)
/EF <</F \fileno\space 0 R>> >> /Name /PushPin}

\newwrite\fileout
\immediate\openout\fileout=test.tmp
\immediate\write\fileout{a}
\immediate\closeout\fileout

\immediate\pdfobj useobjnum \fileno stream file {test.tmp}

\bye

相关内容