为 Latex 着色而对彩色 PDF 进行去色处理?

为 Latex 着色而对彩色 PDF 进行去色处理?

我的用例是这样的:我使用像 fontawesome 这样的“符号”字体,其中每个字母/字形都用作图标,并在 Latex 文档中使用 进行着色\textcolor。但是,我需要的一些符号不在 fontawesome 中,所以我需要将它们作为矢量图提供 - 即 .pdf;在这种情况下,我想以与其他 fontawesome 字形相同的方式对包含的 PDF 进行着色。

到目前为止,我发现了这一点:

\includegraphics 可以用来改变图像颜色吗?

有趣的是,对于我尝试过的矢量图形,\color 命令实际上会将所有黑色更改为给定的颜色。
只有 pdfTeX/LuaTeX 支持此功能,并且仅当图形不包含颜色设置时才支持此功能。此行为可以通过 \includegrahics 的选项 resetcolor 覆盖。然后 pdftex.def 在包含图像之前调用 \normalcolor。

更改完成的 PDF 文件中的颜色

无色 PDF 和 pdfTeX 的简单情况(不幸的是很少见):
PDF 文件包含一些没有明确颜色设置的图形,图像将由图形包的 pdftex 驱动程序包含。

一开始我对此感到困惑,但我想我终于找到了一个关于如何创建这种“没有明确颜色设置”的 PDF 的示例,我将在这里发布 - 但是,我想知道是否有更好/更通用的方法,允许我“取消着色”PDF 以便在 Latex 中包含颜色(也许通过使用imagemagick或类似的东西?)。

好的,首先,让我们使用 Latex 生成要包含的矢量图像 - 为简单起见,使用picture环境(没有 Tikz);这是include1.tex

% include1.tex; build with:
% pdflatex include1.tex
\documentclass[border=0.5mm,varwidth]{standalone}
\begin{document}
  \linethickness{0.5mm}
  \setlength{\unitlength}{10mm}
  \begin{picture}(1,1)(0,0)
    \put(0,0){\line(0,1){1}}
    \put(0,0){\line(1,0){1}}
    \put(1,0){\line(0,1){1}}
    \put(0,1){\line(1,0){1}}
    \put(0.3,0.2){\rule{3mm}{6mm}}
    \put(0.4,0.35){\rule{4mm}{3mm}}
  \end{picture}
\end{document}

因此,运行之后pdflatex include1.tex,我得到include1.pdf,它看起来像这样evince(看起来是黑色的):

包括1.png

然后,这是我将其包含到的 Latex 文档testinclude.tex

% testinclude.tex; build with:
% pdflatex testinclude.tex
\documentclass{article}
\usepackage{color}
\usepackage{graphicx}

\begin{document}
Testing here 1: \textcolor{blue}{\includegraphics[height=1em]{include1.pdf}}

Testing here 2: \textcolor{blue}{\includegraphics[height=1em]{include1.pdf}}
\end{document}

使用 进行编译后pdflatex testinclude.tex,我可以确认一切都符合预期 - 也就是说,包含的 PDF 是彩色的:

测试包括1.png

到目前为止一切都很好;现在,我include1.pdf在 Inkscape 中打开,首先将其保存为 SVG include2.svg;然后include2.svg在 Inkscape 中重新打开,然后另存为include2.pdf

现在,如果我将中的“Testing here 2”行更改testinclude.texTesting here 2: \textcolor{blue}{\includegraphics[height=1em]{include2.pdf}},并使用重新编译pdflatex testinclude.tex,那么我会得到以下内容:

测试包括2.png

因此,显然从 Inkscape 导出的 PDF 不再是无色的,因此 Latex 无法将其着色为蓝色,因此它显示为黑色。

我们可以使用程序解压缩来检查include1.pdf它们:include2.pdfpdftk

pdftk include1.pdf output include1-unc.pdf uncompress
pdftk include2.pdf output include2-unc.pdf uncompress

在 Ubuntu GNU/Linux 下,我们可以使用less -L include1-unc.pdf(或在文本编辑器中打开它们)查看这些文件。未着色的相关部分include1-unc.pdf是:

...
endobj 
4 0 obj 
<<
/Length 298
>>
stream
q
1 0 0 1 0.709 1.417 cm
0 0 1.417 28.346 re f
Q
q
1 0 0 1 1.417 0.709 cm
0 0 28.346 1.417 re f
Q
q
1 0 0 1 29.055 1.417 cm
0 0 1.417 28.346 re f
Q
q
1 0 0 1 1.417 29.055 cm
0 0 28.346 1.417 re f
Q
q
1 0 0 1 9.921 7.087 cm
0 0 8.504 17.008 re f
Q
q
1 0 0 1 12.756 11.339 cm
0 0 11.339 8.504 re f
Q

endstream 
endobj 
3 0 obj 
...

...我们可以看到一堆 PDF 图形运算符,如qQ

对于彩色的、Inkscape 导出的include2-unc.pdf,相关部分是:

...
endobj 
4 0 obj 
<<
/Length 212
>>
stream
q
0 0 0 rg /a0 gs
0.711 29.763 1.414 -28.348 re f
1.418 2.126 28.344 -1.418 re f
29.055 29.763 1.418 -28.348 re f
1.418 30.47 28.344 -1.414 re f
9.922 24.095 8.504 -17.008 re f
12.758 19.841 11.336 -8.504 re f
Q

endstream 
endobj 
2 0 obj 
...

...其中应该rg是设置 RGB 颜色的 PDF 操作符;因此0 0 0 rg将颜色设置为 RGB 0,0,0 - 即黑色。

0 0 0 rg因此,我们可以简单地“擦除”此 RGB 设置,方法是用相同长度的空格字符串替换(8 个字符长)(这样我们就不会弄乱 PDF XREF 词典),可以在像 这样的文本编辑器中nano,也可以直接使用sed

sed -i 's/0 0 0 rg/        /' include2-unc.pdf

...然后用替换中的“Testing here 2”行testinclude.texTesting here 2: \textcolor{blue}{\includegraphics[height=1em]{include2-unc.pdf}}并用重新编译pdflatex testinclude.tex,——然后我们回到彩色的 PDF 内容,如本文中的第一张图片所示。

所以,我的问题是:

  • 是否有一种工具可以帮助我自动“取消着色”我想要以这种方式包含的 PDF(这样我就不必解压缩 PDF 并手动搜索和替换 PDF 颜色运算符)?
  • Latex 中是否存在某种技术/包,可以让我引用磁盘上的彩色 PDF,但在将它们包含在内之前会“取消着色” \includegraphics

答案1

基于https://tex.stackexchange.com/a/74107/36296

您不必替换 PDF 本身中的文本,而是可以使用tikz颜色来为 PDF 中的形状着色:

\documentclass{article}
\usepackage{color}
\usepackage{graphicx}
\usepackage{tikz}
\usetikzlibrary{fadings}

\begin{tikzfadingfrompicture}[name=include2,inner sep=0]
  \node [fill=transparent!0]   {\includegraphics[height=1em]{include2.pdf}};
\end{tikzfadingfrompicture}

\newcommand{\mysymbol}{%
    \begin{tikzpicture}[inner sep=0]
      \node[fill=.,minimum width=1em,minimum height=1em](a){};
      \path[scope fading=include2,fit fading=false];
      \node[fill=white,minimum width=1em,minimum height=1em]{};
    \end{tikzpicture}%
}

\begin{document}
Testing here 1: \textcolor{blue}{\includegraphics[height=1em]{include1.pdf}}

Testing here 2: \textcolor{blue}{\includegraphics[height=1em]{include2.pdf}}

Testing here 2: \textcolor{blue}{\mysymbol}

Testing here 2: \textcolor{red}{\mysymbol}

\end{document}

在此处输入图片描述

相关内容