将pdf中的所有颜色转换为一种特定颜色

Convert all colors in pdf into one specific color

我正在做一个 php 项目,我需要在其中执行一些 pdf 操作。

我需要将矢量文件 (pdf) 的所有颜色“转换”为一种非常特定的颜色(在我的例子中是专色。)

这是一个示例

输入文件可以变化,它可以包含任何颜色(所以我不能只将所有“红色”或“绿色”转换为我的目标颜色)。

我很清楚如何使用 imagemagick 的合成在光栅图像上执行此操作,但我不确定是否可以使用矢量图像。

我的第一个方法是创建一个模板 pdf,其中包含一个所需颜色的填充矩形。我当时的希望是使用 ghostscript 以某种方式将输入文件作为掩码应用到所述模板上。但我认为这是不可能的,因为矢量文件与光栅图像不同。

我的第二种方法是使用 ghostscript 将所有颜色(无论颜色空间如何)转换为所需的颜色。但经过广泛的谷歌搜索后,我只找到了从一种色彩空间转换为另一种色彩空间的解决方案(即 sRGB 到 CMYK,CMYK 到灰度等)

我不是一个设计师,所以也许我只是缺少这些“动作”的正确“术语”。

TL;DR

我正在寻找 library/tool 可以帮助我将矢量文件 (pdf) 的所有颜色“转换”为一种非常特定的颜色。

您可以使用 Ghostscript 完成此操作,但您需要一些 PostScript 编程经验。

本质上,您想通过查看每个 setcolor 操作来覆盖所有 setcolor/setcolorspace 操作,检查颜色 space 和值以查看它是否是您的目标颜色,如果是,则设置颜色space 和值到您想要的目标。

设置颜色 space 和值的各种 PDF 操作都在 ghostpdl/Resource/Init/pdf_draw.ps 中定义。您需要修改以下内容的定义:

/G 和 /g(DeviceGray 中的描边和填充颜色) /RG 和 /rg(DeviceRGB 中的描边和填充颜色) /K 和 /k(DeviceCMYK 中的描边和填充颜色) /SC 和 /sc(Indexed、CalGray、CalRGB 或 Lab 中的描边和填充颜色) /SCN 和 /scn(Pattern、Separation、DeviceN 或 ICCBased 中的描边和填充颜色)

里面有不少皱纹;

您可以忽略模式 space 并只处理由模式本身设置的任何颜色。

对于SC/sc和/SCN/scn你需要弄清楚指定的颜色是否是目标颜色,假设你的目标可以在这些space中指定。请注意 /Indexed 特别有趣,因为它可以有任何其他 space 的基数 space,因此您需要查看。

最后请注意,图像 (bitmaps) 的指定方式不同,更改它们会困难得多。

根据要求的确切性质(即 space/colours 构成有效目标的内容),这可能是一项相当漫长的任务,并且需要具有 PostScript 编程能力的人来编写它。

哦,最后一点,您是否考虑过透明度?那也可以指定混合色space,这可能意味着你替换了颜色后,它会混合成不同的颜色space,导致你仔细的替换消失。

为了避免您认为这不太可能,我应该提到许多 PDF 制作者创建的文件中包含透明度组ps,即使没有实际的透明度操作发生。

您可以尝试以高分辨率栅格化并使用 ImageMagick 转换颜色,然后使用 potrace[=16= 重新矢量化]

因此,如果您有 PDF,您会这样做:

convert -density 288 document.pdf ... 

既然你提供了PNG,我会做:

convert image.png -fill black -fuzz 10% +opaque white pgm:- | potrace -b svg -o result.svg -

这给出了这个 SVG:

<?xml version="1.0" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN"
 "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd">
<svg version="1.0" xmlns="http://www.w3.org/2000/svg"
 width="800.000000pt" height="450.000000pt" viewBox="0 0 800.000000 450.000000"
 preserveAspectRatio="xMidYMid meet">
<metadata>
Created by potrace 1.13, written by Peter Selinger 2001-2015
</metadata>
<g transform="translate(0.000000,450.000000) scale(0.100000,-0.100000)"
fill="#000000" stroke="none">
<path d="M4800 4324 c0 -50 -2 -55 -17 -49 -84 35 -140 -17 -130 -119 7 -77
70 -120 122 -82 16 11 21 11 33 0 7 -8 18 -12 23 -9 5 4 9 76 9 161 0 147 -1
154 -20 154 -18 0 -20 -7 -20 -56z m-22 -90 c46 -32 18 -134 -38 -134 -25 0
-40 29 -40 79 0 39 19 71 43 71 7 0 23 -7 35 -16z"/>
<path d="M4926 4358 c-9 -12 -16 -35 -16 -50 0 -18 -5 -28 -15 -28 -8 0 -15
-7 -15 -15 0 -8 7 -15 15 -15 12 0 15 -17 15 -89 0 -89 6 -105 38 -94 8 3 12
31 12 94 0 88 0 89 25 89 16 0 25 6 25 15 0 9 -9 15 -25 15 -21 0 -25 5 -25
30 0 30 7 34 43 30 13 -1 18 4 15 17 -5 29 -72 30 -92 1z"/>
<path d="M3347 4364 c-4 -4 -7 -16 -7 -26 0 -14 6 -19 23 -16 14 2 22 10 22
23 0 20 -25 32 -38 19z"/>
<path d="M4170 4310 c0 -23 -4 -30 -20 -30 -11 0 -20 -7 -20 -15 0 -8 9 -15
20 -15 18 0 20 -7 20 -80 0 -74 2 -81 25 -96 32 -21 75 -12 75 17 0 16 -4 19
-21 14 -30 -10 -39 9 -39 83 l0 62 30 0 c20 0 30 5 30 15 0 10 -10 15 -30 15
-27 0 -30 3 -30 30 0 23 -4 30 -20 30 -16 0 -20 -7 -20 -30z"/>
<path d="M3345 4278 c-3 -8 -4 -59 -3 -114 2 -80 6 -99 18 -99 12 0 15 19 15
109 0 79 -4 111 -12 113 -7 3 -15 -2 -18 -9z"/>
<path d="M3453 4283 c-9 -3 -13 -34 -13 -108 0 -74 4 -105 13 -108 29 -10 37
6 37 78 0 57 4 75 18 88 46 42 72 10 72 -91 0 -54 4 -71 15 -76 22 -8 26 10
23 104 -3 77 -5 84 -31 104 -24 17 -32 19 -59 8 -18 -6 -38 -8 -47 -3 -9 5
-22 6 -28 4z"/>
<path d="M3687 4283 c-4 -3 -7 -71 -7 -150 l0 -143 25 0 c23 0 25 4 25 45 0
42 2 45 19 35 33 -17 61 -11 92 19 24 25 29 37 29 81 0 95 -51 141 -119 107
-25 -13 -31 -13 -35 -1 -6 15 -19 18 -29 7z m122 -47 c19 -22 23 -78 9 -106
-29 -55 -88 -26 -88 43 0 62 48 100 79 63z"/>
<path d="M3927 4284 c-4 -4 -7 -45 -7 -91 0 -76 2 -86 25 -108 27 -28 61 -32
92 -10 18 13 22 13 27 0 3 -8 12 -12 21 -9 13 5 15 24 13 113 -3 98 -4 106
-23 106 -18 0 -20 -8 -23 -75 -4 -94 -28 -128 -72 -100 -10 6 -16 34 -20 91
-5 75 -15 101 -33 83z"/>
<path d="M4432 4282 c-9 -7 -12 -43 -10 -148 3 -136 4 -139 26 -142 20 -3 22
1 22 41 l0 45 35 -11 c31 -9 39 -8 63 10 37 27 54 83 42 136 -15 68 -64 94
-120 63 -20 -12 -26 -12 -35 0 -6 8 -15 10 -23 6z m122 -54 c22 -31 20 -81 -3
-109 -19 -23 -21 -23 -48 -9 -24 13 -28 23 -31 62 -3 39 1 49 20 62 30 22 44
20 62 -6z"/>
<path d="M4310 4096 c0 -30 30 -43 47 -21 16 23 5 45 -23 45 -19 0 -24 -5 -24
-24z"/>
<path d="M4046 3795 l-67 -141 -227 -12 c-418 -22 -765 -74 -1127 -167 -612
-157 -1080 -387 -1387 -684 -214 -205 -323 -393 -359 -615 -16 -101 -6 -270
20 -361 136 -461 637 -856 1409 -1111 152 -51 434 -125 583 -154 l66 -13 -30
-169 c-16 -93 -27 -171 -24 -174 2 -3 124 58 271 135 l266 140 80 -9 c44 -5
197 -14 339 -21 259 -12 617 -3 844 21 l88 9 265 -140 c146 -77 268 -138 270
-136 5 4 -41 294 -52 328 -4 13 8 19 58 28 465 89 939 260 1278 461 626 370
880 871 686 1356 -69 174 -228 375 -415 526 -517 418 -1411 697 -2402 750
l-226 12 -71 141 -70 140 -66 -140z m-202 -407 c-31 -62 -119 -241 -196 -398
-76 -156 -140 -285 -142 -287 -3 -3 -799 -120 -1156 -170 -102 -14 -188 -29
-193 -32 -4 -4 102 -113 235 -242 133 -129 353 -344 489 -479 l248 -245 -45
-260 c-25 -143 -58 -332 -73 -420 l-27 -160 -41 2 c-61 2 -333 68 -515 124
-674 209 -1153 533 -1334 905 -59 121 -77 209 -71 349 5 137 35 235 109 359
58 97 206 261 311 344 463 366 1242 627 2097 701 69 6 141 13 160 15 19 1 72
4 118 4 l82 2 -56 -112z m906 86 c760 -79 1420 -283 1875 -581 864 -566 763
-1326 -245 -1840 -266 -136 -602 -253 -942 -328 -92 -21 -173 -35 -181 -32 -9
3 -20 44 -31 114 -10 59 -42 248 -72 419 l-54 311 213 210 c116 115 337 331
489 479 153 148 274 271 270 275 -4 3 -106 20 -227 37 -452 64 -1118 162
-1120 164 -6 6 -195 387 -291 587 l-104 214 137 -7 c76 -4 203 -14 283 -22z
m-424 -2761 c137 -73 200 -111 193 -118 -14 -14 -794 -14 -809 1 -7 7 49 41
192 117 112 58 207 107 212 107 5 0 100 -48 212 -107z"/>
<path d="M1815 3669 c-46 -47 -113 -80 -221 -111 -62 -17 -106 -22 -204 -22
-137 0 -185 12 -221 58 -48 61 -211 80 -449 53 -118 -14 -400 -63 -408 -72 -3
-3 28 -145 32 -145 1 0 55 11 120 25 181 37 365 58 481 53 98 -3 105 -5 125
-30 113 -144 579 -119 806 44 50 35 109 108 97 118 -5 4 -33 21 -63 38 l-55
31 -40 -40z"/>
<path d="M7647 575 c-66 -79 -247 -137 -432 -138 -134 0 -170 10 -221 61 -18
17 -53 37 -84 46 -70 21 -238 21 -395 0 -122 -15 -364 -60 -372 -68 -5 -5 17
-119 26 -133 4 -7 47 -2 121 13 181 37 358 56 477 52 l108 -3 37 -37 c120
-117 482 -110 720 13 75 40 168 123 168 151 0 10 -110 80 -122 77 -2 0 -16
-16 -31 -34z"/>
</g>
</svg>

看起来像这样的 PNG(因为 Whosebug 不允许 SVG 图像 AFAIK):

您可以通过编辑 SVG 将所有路径设为您喜欢的绿色阴影,如下所示:

sed 's/path /path fill="#7CBE89" /' black.svg > green.svg