PNG(具有透明背景)和 \pdfximage \pdfrefximage

PNG(具有透明背景)和 \pdfximage \pdfrefximage

我正在使用pdflatex(Windows 7 上的 MiKTeX 2.9 便携版),并使用\pdfximage\pdfrefximage来包含图形。

在我看来,使用具有透明背景的 PNG 会产生意外的行为。

似乎生成的索引\pdfximage已损坏 - 这使得“下一个图形”无法使用。但下一个图形使用。

我希望下面的例子能够说明我的机器上发生的情况:

这是正确的用法吗,还是我没有pdflatex正确使用原语?

% SAMPLE
\pdfoutput=1 
\documentclass[german]{article} 
\usepackage[a4paper]{geometry} 
\usepackage{babel} 
% ------------------------------------------ 
% When the following line is used, \LOGOiii yields 'my_other_pic.jpg' - which is not correct.
\pdfximage width 20.0mm height 8.0mm {png_transparent_bg.png} 

% When replacing the above with either of the following lines, \LOGOiii yields 'my_cool_pic.jpg' - which is correct
% (but then I don't have my logo with transparent background)
%\pdfximage width 20.0mm height 8.0mm {my_pic.png}   % png without transparent background
%\pdfximage width 20.0mm height 8.0mm {png_transparent_bg.jpg}  % jpg - no transparent background

\newcommand{\LOGOi}{\pdfrefximage1}

% If png_transparent_bg.png is used, attempting to reference this image results the error:
%     ! pdfTeX error (ext1): cannot find referenced object. (but pdfrefximage3 works!)
\pdfximage height 28.0mm             {my_other_pic.png} 
\newcommand{\LOGOii}{\pdfrefximage2}

\pdfximage height 20.0mm             {my_cool_pic.png} 
\newcommand{\LOGOiii}{\pdfrefximage3}  % 

\begin{document} 
\noindent This pdf illustrates behavior diferences between 'loading' a png graphic     with transparent background as first graphic - via pdfximage.
{\LOGOiii}
{\LOGOii}  % comment to remove compile error
\rule{-15mm}{0mm}
{\LOGOi}
\end{document} 
\endinput 

控制台输出(尝试引用第二个图形对象) - 错误:

>h:\MikTeXTest\MikTeX.2.9p\texmf\miktex\bin\pdflatex -aux-directory=h:\temp\pdflatex --enable-write18 test_pdfxrefimage.tex 
This is pdfTeX, Version 3.1415926-2.3-1.40.12 (MiKTeX 2.9)
entering extended mode
(Q:\TA ... \TST\test_pdfxrefimage\test_pdfxrefimage.tex
LaTeX2e <2011/06/27>
... console output deleted ...

)) (h:\temp\pdflatex\test_pdfxrefimage.aux)
*geometry* driver: auto-detecting
*geometry* detected driver: pdftex
! pdfTeX error (ext1): cannot find referenced object.
<to be read again> 
               }
l.27 {\LOGOii}
                % uncomment for error
!  ==> Fatal error occurred, no output PDF file produced!
Transcript written on h:/temp/pdflatex/test_pdfxrefimage.log.
>Exit code: 1

下面是包含上述代码的 pdflatex 的控制台输出,但有注释行:

%{\LOGOii}  % comment to remove compile error

编译成功-但引用了错误的图形:

>h:\MikTeXTest\MikTeX.2.9p\texmf\miktex\bin\pdflatex -aux-directory=h:\temp\pdflatex --enable-write18 test_pdfxrefimage.tex 
This is pdfTeX, Version 3.1415926-2.3-1.40.12 (MiKTeX 2.9)
entering extended mode
(Q:\TA ... \TST\test_pdfxrefimage\test_pdfxrefimage.tex
LaTeX2e <2011/06/27>
... console output deleted ...

)) (h:\temp\pdflatex\test_pdfxrefimage.aux)
*geometry* driver: auto-detecting
*geometry* detected driver: pdftex

Overfull \hbox (11.66379pt too wide) in paragraph at lines 24--28
\OT1/cmr/m/n/10 This pdf illustrates behavior diferences between 'loading' a pn
g graphic with transparent background
[1{h:/MikTeXTest/MikTeX.2.9p/localtexmf/fonts/map/pdftex/pdftex.map} <Q:/TA.../TST/test_pdfxrefimage/my_other_pic.png (PNG copy)> <Q:/TA.../TST/test_pdfxrefimage/png_transparent_bg.png>]
(h:\temp\pdflatex\test_pdfxrefimage.aux) )
(see the transcript file for additional information)<h:/MikTeXTest/MikTeX.2.9p/
texmf/fonts/type1/public/amsfonts/cm/cmr10.pfb>
Output written on test_pdfxrefimage.pdf (1 page, 33610 bytes).
Transcript written on h:/temp/pdflatex/test_pdfxrefimage.log.
>Exit code: 0

引用“my_other_pic.png”但实际上应该使用“my_cool_pic.png”。

答案1

明显的问题是生成的数字是不是2 对于第二幅图像,作为一个简单的

\showthe\pdflastximage

放在后面

\pdfximage height 28.0mm             {my_other_pic.png} 

将会呈现:

> 3.
l.18 \showthe\pdflastximage

这可能是因为包含了另一个图片对象来“掩盖”具有透明背景的图片对象。

还有另一个原语,\pdflastximage可以(并且应该)用于这些情况:它是一个只读整数,其中加载了分配给最后一个对象的数字\pdfximage。但是你不能

\newcommand{\LOGOi}{\pdfrefximage\pdflastximage}

因为这会总是参考最后一张图片。需要一些低级技巧:

\pdfximage width 20.0mm height 8.0mm {png_transparent_bg.png} 
\edef\LOGOi{\pdfrefximage\the\pdflastximage\relax}

\pdfximage height 28.0mm             {my_other_pic.png} 
\edef\LOGOii{\pdfrefximage\the\pdflastximage\relax}

\pdfximage height 20.0mm             {my_cool_pic.png} 
\edef\LOGOiii{\pdfrefximage\the\pdflastximage\relax}

每个都\edef将扩展到当前值;在你的情况下,和的\the\pdflastximage扩展将是\LOGOi\LOGOii\LOGOiii

> \LOGOi=macro:
->\pdfrefximage 1\relax .

> \LOGOii=macro:
->\pdfrefximage 3\relax .

> \LOGOiii=macro:
->\pdfrefximage 4\relax .

以便以后正确使用图像。

不太清楚为什么你不想\includegraphics为此使用更高级别。如果你担心多次使用的图片会多次包含在 PDF 文件中,请不要担心。


如果你继承了一些使用这些低级技巧的文档,只需注释掉这些行并根据此模型进行更改

%\pdfximage width 20.0mm height 8.0mm {png_transparent_bg.png} 
%\edef\LOGOi{\pdfrefximage\the\pdflastximage\relax}
%\pdfximage height 28.0mm             {my_other_pic.png} 
%\edef\LOGOii{\pdfrefximage\the\pdflastximage\relax}
%\pdfximage height 20.0mm             {my_cool_pic.png} 
%\edef\LOGOiii{\pdfrefximage\the\pdflastximage\relax}

\usepackage{graphicx}
\newcommand\LOGOi{\includegraphics[width 20.0mm, height 8.0mm]{png_transparent_bg.png}}
\newcommand{\LOGOii}{\includegraphics[height 28.0mm]{my_other_pic.png}}
\newcommand{\LOGOiii}{\includegraphics[height 20.0mm]{my_cool_pic.png}}

答案2

切勿使用\pdfrefximage硬编码的 PDF 对象编号。正确的语法是:

\pdfrefximage\pdflastximage

当然,你可以将生成的 PDF 对象编号存储\pdfximage在宏中以供以后使用。但是你不能不使用\newcommand,因为\pdflastximage必须在宏定义期间进行扩展:

\edef\LOGOobjI{\the\pdflastximage}

或(全局宏定义,组外可见)

\xdef\LOGOobjI{\the\pdflastximage}

以后的使用如下所示:

\pdfrefximage\LOGOobjI

埃格尔\LOGOi在下面评论。他提出了一个完全符合您期望的 宏。

相关内容