通过 \pdfliteral 包含 PDF

通过 \pdfliteral 包含 PDF

pdfinlimg 包和 perl 脚本允许通过命令将(“二进制”)图像直接包含到 LaTeX 源代码中\pdfliteral

例如,

\documentclass[margin=1cm]{standalone}
\newcommand{\pdfinlimg}[5]{
\makebox[#1cm][l]{\immediate\pdfliteral{
  q
  #3 0 0 #4 0 0 cm
  #1 0 0 #2 0 0 cm
  0.885 0 0 0.885 0 0 cm
  BI
  /W #3
  /H #4
  /CS /RGB
  /BPC 8
  /F [ /AHx /Fl ]
  ID
  #5>
  EI
  Q
}\vbox to #2cm{}}
}

\begin{document}
\pdfinlimg{1}{1}{48}{48}{
789CED973D68625918866108290649B1488A41A658C216214C112E1641A6182445901483A40821C5
202982A4089222488A202944528858C8C562902D06994AA6089262B8A4089262902D069962912D16
AB45B60887619F73BFEBF1EAD59098728597C3F5CBF979CFFBFD9DA89F4ACD31C71C73CCF10834BE
344AC552E1B200F4477EF0F1740BA87FAA3F878C73E3A43EA4621BB1D886158B5A56D41A7E449F6C
09FF125E7BB3363BA57B95D84AC4DEC632C719F5A3AEBE3F0F7FD4ACD59585170BE1E570E77B6736
3E28933B4FF76E6D05EE6C75D554D5BE878FBDE1F7448BFC6464D59DDEA1FB25175F8FA0925DB1D9
7C363E858BB4ECA6B7FDD45115A5CA4A8FE6E3B4A34E3A9E25DF53C7ED91BF0256B1F6D6EEDF9412
EB91D05268463E3F7D7C00373547F8F1BEA9B61A1E01C86CD6C70903D6DE797CD0A7542ECDEC2FCD
E7BAE16D7BD456515B15FBDE4113E90561265FD59FE52FA3CFD7A6B7E1454F1DB6C7AF5F1EA0A272
DB39EBB5055AA72D6D292AB5EFE85532FFAA9E7CBB46489371C9F7C9C4768231BE197F6CC605F5A9
041CE143E3A891DA4AE9045FB720D63C6E6A3EBB4D75D6F5E65F37D23B71E267E5B71532776F778F
117A7C3C32E346F409467265A80C401676263670075522114D74CE3B23CCAF1B99DDF8C2E2C2CAAF
2B9993945DB5D38769F82054FB5BFBC9FA4C2443F4CAF5CB1E1FC808A5F4513AB214198934978FC4
331300C556F3D94AB4EE5A7228ED207D90C66EC09EF5CFF5117D82FE3247104E83F0F0EB03E80EEC
1C5F8D0F11B5F676925457E10C5207A9317D58C5A1125D1AAE43DD3298E34FF177F1D2656618CF02
04294E889F317D18D98106B1B6AA417166C44186B0D6C7E5C371B5DF6B860F4B186B1F6B8039126F
181909033B9F19D1073E1BB6A634965F017DFCE7FA49FA476E0D1F89A8EE9F5DCD275FD096170B22
88804843551C0DB7EC41425757FFE9F9FE4894EE3BAD8DC2DA2B7D77BDD6C7C49C1B2469FE943DCB
465EBB45A96AC3874022F038578C1ACB61BEF1D4DEFE5EE86528FB21E1E9435338EF8DC74F591749
67B3C48DB2A759EFA0AACDC38020445EF9392257D5EEFCE8401E674998455E0DF900729F0285D100
01F135E1C487E623FABCABEB62E2CFF1814ACE89039FCC49C69CDBBC6EF2EC9156E5970277702E22
705F2AA1F04101A0F90C8A76FF9FBE0E9EAA2D23C1234ED4B73E480CF37D62CA0FF8A08F5183EB60
818F3F60B0247792B98B9CEC6CF88CE91344EBB6C565C97D1C5738F7E5BB3F6C0869DAA8DBCB8C3E
AD8ADD75513ACB12817EC50016C8F053FE54BFC831B37359B0449FCA543EA0F7770F2FE3475D7F6E
EADE4B83483EED7842114B7476F8F8F469B3A78B46C52641A81E42061ABA74B8DF5246F05DCB9DD9
E7A7F1D7E3DF1BB7EE7BE358FAFB7855A47B528AC90BA758EA974B7D970F118BBF600519E90B7C00
68F34D30EBC915DB394A5B4B21CF5F0F37FDFBD1F7CF4D4D7D76C693BD32DEBF4C3A43CF04611092
5C784D7E3E103FF0E73AEC061036B91DCF1D26953C59A144AE114E8C01348B99D44E5C97D04171E6
D06920D1886D04D4CF8F758BDA328D0FC985DF054C238428F54E256350CFA74A47F18988BDD199C2
AD75C41E67389124A219713589613EF49BC74D76620632A40CAA36AF9A529F83A04D20110D45DA07
0B1F90FDB958D47D81B3C89D6961031F2E423523F6206FD6A295DC4E1E78682E35D63F5AEE638CDC
61A6143124C2825D1B0FD3BA07BD0C89CB242AF06CFFDFFE03614C6B932ACD5AF977098B1616CB72
588C08AE15FEAB0BA80CE643773DB7DD30997399C989B8438CDA418B5E91344BC0C3394E6995022E
BD0C7F2117948C8591D0A24305D722BE9C6B66C21029FC46B67AD27B1EF5A46B18F058C2BF7E8B18
272E77BE3A6333694688E9B798F7DED310BCC2FD14FBB4B5F7B32E9F638E39E6F8DFE33FDD12CF75
}
\end{document}

生产

喵喵猫

通过pdflatex

PDF 文件是否可以代替光栅图像实现类似的功能,即我可以将(以某种方式编码的)PDF 源代码复制到我的 LaTeX 文件中,以便像使用\includegraphics常规文件一样嵌入它吗?

编辑: 考虑以下简单且未压缩的 PDF

%PDF-1.4
%¿÷¢þ
1 0 obj
<< /Pages 3 0 R /Type /Catalog >>
endobj
2 0 obj
<< /Creator (cairo 1.10.2 \(http://cairographics.org\)) /Producer (cairo 1.10.2 \(http://cairographics.org\)) >>
endobj
3 0 obj
<< /Count 1 /Kids [ 4 0 R ] /Type /Pages >>
endobj
4 0 obj
<< /Contents 5 0 R /Group << /CS /DeviceRGB /S /Transparency /Type /Group >> /MediaBox [ 0 0 32.078125 30.984375 ] /Parent 3 0 R /Resources 6 0 R /Type /Page >>
endobj
5 0 obj
<< /Length 69 >>
stream
q
Q q
q
1 0 0 1 -0.000000000000000184 -0.015625 cm
/a0 gs /x5 Do
Q
Q
endstream
endobj
6 0 obj
<< /ExtGState << /a0 << /CA 1 /ca 1 >> >> /XObject << /x5 7 0 R >> >>
endobj
7 0 obj
<< /BBox [ 0 0 33 31 ] /Group << /CS /DeviceRGB /S /Transparency /Type /Group >> /Resources 8 0 R /Subtype /Form /Type /XObject /Length 590 >>
stream
q
0 0 0 rg /a0 gs
28.938 30.203 m 16.031 7.781 l 3.141 30.203 l 2.828 30.656 2.234 31 
1.641 31 c 0.844 31 0 30.406 0 29.547 c 0 1.516 l 0 0.656 0.734 0.016 
1.641 0.016 c 2.578 0.016 3.281 0.656 3.281 1.516 c 3.281 23.375 l 
7.062 16.844 10.797 10.328 14.547 3.797 c 14.797 3.297 15.391 3 16.031 
3 c 16.734 3 17.125 3.406 17.531 3.797 c 21.266 10.328 25 16.844 28.781 
23.375 c 28.781 1.516 l 28.781 0.656 29.484 0.016 30.438 0.016 c 31.328 
0.016 32.078 0.656 32.078 1.516 c 32.078 29.5 l 32.078 30.344 31.234 31 
30.438 31 c 29.828 31 29.234 30.75 28.938 30.203 c h
28.938 30.203 m f
Q
endstream
endobj
8 0 obj
<< /ExtGState << /a0 << /CA 1 /ca 1 >> >> >>
endobj
xref
0 9
0000000000 65535 f 
0000000015 00000 n 
0000000064 00000 n 
0000000192 00000 n 
0000000251 00000 n 
0000000427 00000 n 
0000000545 00000 n 
0000000630 00000 n 
0000001395 00000 n 
trailer << /Info 2 0 R /Root 1 0 R /Size 9 /ID [<28d7524294bb60d1f3e318954d8f7b36><28d7524294bb60d1f3e318954d8f7b36>] >>
startxref
1455
%%EOF

M显示METAPOST 徽标的字母:

在此处输入图片描述

我怎样才能将绘图说明包含到我的 LaTeX 代码中?

答案1

问题中的方法使用内联图像。如果多次使用同一幅图像,则每次都会嵌入图像,从而增加文件大小。因此,对于多次使用的较大图像,不建议使用此方法。PDF 规范说:

8.9.7 内嵌图像

作为第 8.9.5 节“图像字典”中描述的图像 XObject 的替代,可以以内联图像的形式指定采样图像。这种类型的图像直接在将在其中绘制的内容流中定义,而不是作为单独的对象。由于内联格式使应用程序在管理图像数据方面缺乏灵活性,因此它应该仅用于小图像(4 KB 或更小)。

任意 PDF 文件无法内联:

  • 字体需要在页面资源中定义、包含和声明。名称不得与现有名称冲突。
  • 其他资源(图形状态,......)也出现了同样的问题。

因此最简单的方法是使用\pdfximage

有一个小例外,如果 PDF 内容流仅包含一些简单的绘图指令。这些可以通过\pdfliteral(参见 TikZ 绘图操作符)嵌入。但内容应放在保存/恢复对中(q... Q),因为参考点和当前传输矩阵不能改变;pdfTeX 不会分析 PDF 页面流操作符,\pdfliteral因此会感到困惑。

该程序pdftk(以及其他一些)可以解压缩 PDF 文件:

pdftk test.pdf cat output test-uncompress.pdf uncompress

然后你必须寻找页面对象。它可以在以下路径找到:

文件尾部位于文件末尾,例如:

trailer

<<
/Info 6 0 R
/Root 5 0 R
/Size 7
/ID [<7f98aa3833c5442f9b261368ace2d575> <7f98aa3833c5442f9b261368ace2d575>]
>>
startxref
810
%%EOF

该条目Root链接到Catalog对象 5:

5 0 obj 
<<
/Pages 3 0 R
/Type /Catalog
>>
endobj 

入口Pages

2 0 obj 
<< 
/Parent 3 0 R 
/MediaBox [0 0 595.276 841.89] 
/Resources 1 0 R
/pdftk_PageNum 1
/Contents 4 0 R
/Type /Page
>>
endobj 

Pages是页面树的根:

3 0 obj 
<<
/Kids [2 0 R]
/Count 1
/Type /Pages
>>
endobj 

我们得到对象 2 作为页面对象:

2 0 obj 
<<
/Parent 3 0 R
/MediaBox [0 0 595.276 841.89]
/Resources 1 0 R
/pdftk_PageNum 1
/Contents 4 0 R
/Type /Page
>>
endobj 

现在我们有页面流对象作为Contents对象 4 的值:

4 0 obj 
<<
/Length 201
>>
stream
q
1 0 0 1 149.21 660.395 cm
[]0 d 0 J 0.996 w 0 0 m 0 56.693 l S
Q
q
1 0 0 1 149.709 660.893 cm
[]0 d 0 J 0.996 w 0 0 m 56.693 0 l S
Q
q
1 0 0 1 206.9 660.395 cm
[]0 d 0 J 0.996 w 0 0 m 0 56.693 l S
Q

endstream 
endobj 

stream和之间的部分通常被和endstream包围。在这种特殊情况下,后者是不必要的,因为代码绘制了三条线,每条线已经被和包围。绘图区域是对象的:\pdfliteralqQqQMediaBoxPage

/MediaBox [0 0 595.276 841.89]

Ghostscript 的设备bbox可以计算可见的边界框:

gs -sDEVICE=bbox -dBATCH -dNOPAUSE test.pdf
...
Page 1
%%BoundingBox: 148 660 208 718
%%HiResBoundingBox: 148.712058 660.395019 207.397962 717.088056

PostScript 和 PDF 中的单位是bp

然后,您可以计算的移动、缩放(使用 PDF 运算符或在 TeX 级别使用\scalebox)和位置(例如环境picture可以提供帮助)\pdfliteral

例子:

\documentclass{article}
\usepackage{graphicx}

\begin{document}
\setlength{\fboxsep}{2pt}
\setlength{\fboxrule}{.1pt}

\fbox{\includegraphics{test.mps}}

\fbox{%
  \setlength{\unitlength}{1bp}%
  \begin{picture}(58.685904,56.693037)% width and height of the image
    \put(-148.712058,-660.395019){%
      \pdfliteral{%
        q % save
          1 0 0 rg 1 0 0 RG % make it red
          % operators from the /Contents object of the PDF image:
          q
          1 0 0 1 149.21 660.395 cm
          []0 d 0 J 0.996 w 0 0 m 0 56.693 l S
          Q
          q
          1 0 0 1 149.709 660.893 cm
          []0 d 0 J 0.996 w 0 0 m 56.693 0 l S
          Q
          q
          1 0 0 1 206.9 660.395 cm
          []0 d 0 J 0.996 w 0 0 m 0 56.693 l S
          Q
        Q % restore
      }%
    }%  
  \end{picture}%
}
\end{document}

结果


有关的:国会议员,MetaPost 的输出是一个简化的 PostScript,可以通过 嵌入\pdfliteral,请参阅由 加载的 Hans Hagen 的转换宏pdftex.def

该程序净化可以将 PostScript 和 PDF 文件转换为 MetaPost 输出的 PostScript,例如:

purifyeps test.pdf test.mps

然后test.mps可以通过 包含\includegraphics

答案2

您的 PDF 示例显示了 Metapost Logo,它相对简单,可以通过将带有绘图语句 (Object No. ) 的 XObject 内容流内联到页面内容流中来实现内联。XObject 内容流引用了我们也内联的7 0外部图形状态 (Object No 8 0) :/a0

\documentclass[margin=1cm]{standalone}

\begin{document}
\pdfliteral page {
q
0 0 0 rg /CA 1 /ca 1
28.938 30.203 m 16.031 7.781 l 3.141 30.203 l 2.828 30.656 2.234 31
1.641 31 c 0.844 31 0 30.406 0 29.547 c 0 1.516 l 0 0.656 0.734 0.016
1.641 0.016 c 2.578 0.016 3.281 0.656 3.281 1.516 c 3.281 23.375 l
7.062 16.844 10.797 10.328 14.547 3.797 c 14.797 3.297 15.391 3 16.031
3 c 16.734 3 17.125 3.406 17.531 3.797 c 21.266 10.328 25 16.844 28.781
23.375 c 28.781 1.516 l 28.781 0.656 29.484 0.016 30.438 0.016 c 31.328
0.016 32.078 0.656 32.078 1.516 c 32.078 29.5 l 32.078 30.344 31.234 31
30.438 31 c 29.828 31 29.234 30.75 28.938 30.203 c h
28.938 30.203 m f
Q
}
\end{document}

相关内容