包含 PDF 线宽

包含 PDF 线宽

我用 Inkscape 制作了一张图像,并将其导出为 PDF,我想将其包含在文档中。但是,有一件烦人的事情:线宽(例如矩形的边框宽度)取决于 PDF 的缩放比例。例如,当我像这样将其包含两次时

\includegraphics[width=1.00\textwidth]{Example.pdf}
\includegraphics[width=0.50\textwidth]{Example.pdf}

上图中的线条比下图的线条粗。

我能否以某种方式覆盖线宽,使得它始终为 1 毫米,而不管缩放比例如何,或者(重新)定义用于计算实际宽度的基数?

答案1

一般来说答案是否定的。线宽通常在文件中明确设置.pdf。此设置将覆盖 TeX 文件之前可能设置的任何设置。

了解 PDF 内部结构和 PDF 页面流操作符后,有时.pdf可以调整文件。让我们以一个简单的 PostScript 文件为例:

%!PS
%%BoundingBox: 99 99 121 111
%%HiResBoundingBox: 99.499989 99.499989 120.500012 110.499958
100 100 moveto 20 0 rlineto 0 10 rlineto
-20 0 rlineto closepath
100 100 moveto
10 5 rlineto
stroke
showpage
%%EOF

然后程序 epstopdf 调用 ghostscript 并生成一个.pdf文件。由于我们需要查看页面流,因此可以通过以下方式解压缩它:

pdftk Example1.pdf cat output Example2.pdf uncompress

/Contents可以通过对象中的键找到页面流/Page(这里用注释标注,有时用相应的 PostScript 运算符):

q 0.1 0 0 0.1 0 0 cm % save 0.1 scale
/R7 gs               % not relevant here
10 w                 % 10 setlinewidth
0 G                  % black for stroking
10 10 m              % m = moveto
210 10 l             % l = lineto
210 110 l
10 110 l
h                    % closepath
10 10 m
110 60 l
S                    % stroke
Q                    % restore

这里 ghostscript 添加了线宽设置,PostScript 文件没有设置线宽。可以通过注释或用空格覆盖来删除。对象的大小非常重要不是已更改,否则许多其他设置需要更新:

  • 流的长度记录在/Lengthdict流对象中的键中。
  • 间接对象​​的偏移量记录在xref表中。

禁用线宽设置的示例(%在 PostScript 和 PDF 中都是注释字符):

%0 w

可以选择重新.pdf压缩修改后的文件,请参阅上面的命令行pdftk

以下示例使用 pdfTeX。由于我们不想在图形之后保留更改的设置(并让 pdfTeX 感到惊讶),因此将更改的设置放在save/restore对之间,即 pdfTeX: \pdfsave/ \pdfrestore。然而这也会影响当前点,必须在完全相同的点调用这两个图元。否则,TeX 内部坐标系和 PDF 输出的坐标系的同步将丢失。

\documentclass{article}
\usepackage[a4paper, hmargin=60mm, vmargin=0mm]{geometry}
\pagestyle{empty}
\usepackage{graphicx}
\begin{document}
\centering
\section*{Unmodifed example}

\includegraphics[width=\linewidth]{ExampleUnmodified.pdf}

\includegraphics[width=.5\linewidth]{ExampleUnmodified.pdf}

\section*{Example without line width}

\includegraphics[width=\linewidth]{ExampleWithoutLineWidth.pdf}

\includegraphics[width=.5\linewidth]{ExampleWithoutLineWidth.pdf}

\section*{Example with settings}

\newcommand*{\pdfset}[2]{%
  \leavevmode
  \pdfsave
  \pdfliteral{#1}%
  \rlap{#2}%
  \pdfrestore
  \phantom{#2}%
}

\pdfset{%
  10 w % setlinewidth
  1 J  % setlinecap: round
  1 j  % setlinejoin: round
}{\includegraphics[width=\linewidth]{ExampleWithoutLineWidth.pdf}}

\pdfset{%
  20 w % setlinewidth
  1 J  % setlinecap: round
  1 j  % setlinejoin: round
}{\includegraphics[width=.5\linewidth]{ExampleWithoutLineWidth.pdf}}

\end{document}

结果

可以看出几个问题/缺点:

  • 所包含文件的媒体大小/边界框.pdf不会改变。TeX 可以看到trim这一点。如果线宽发生变化,边界框也可能会改变。选项可以提供帮助:如果线宽小于原始值,则使用正值;如果边界框增大,则使用负值。有时可以轻松计算出这些值,否则可以目测(例如:\fbox使用\setlength{\fboxsep}{0pt})。根据图像的不同,四边的值甚至可能不同。

  • 即使线宽相同,缩放后的图像看起来也会有很大差异,因为如果形状被缩放,线宽和形状的比例会不同。

相关内容