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

时间:2017-04-11 15:12:41

标签: pdf imagemagick ghostscript

我正在开发一个php项目,我需要执行一些pdf操作。

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

这是一个示例

example

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

我对如何使用imagemagick的复合材料在光栅图像上进行操作有一个很好的想法,但我不确定它是否可以使用矢量图像。

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

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

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

TL; DR

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

  • 输入文件可能会有所不同(各种形状和颜色),但始终是不带任何字体的pdf文件。
  • 输出必须保留为矢量文件(读取,不进行光栅化。)
  • 我在运行Linux的VPS上有root访问权限(centos7,我认为这是无关紧要的。)

2 个答案:

答案 0 :(得分:0)

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

基本上,您希望通过查看每个setcolor操作来覆盖所有setcolor / setcolorspace操作,检查颜色空间和值以查看它是否是您的目标颜色,如果是,则将颜色空间和值设置为所需目标。

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

/ G和/ g(DeviceGray中的笔触和填充颜色) / RG和/ rg(DeviceRGB中的笔触和填充颜色) / K和/ k(DeviceCMYK中的笔触和填充颜色) / SC和/ sc(Indexed,CalGray,CalRGB或Lab中的笔触和填充颜色) / SCN和/ scn(模式,分离,DeviceN或ICCBased中的笔触和填充颜色)

那里有很多皱纹;

您可以忽略模式空间,只处理模式本身设置的任何颜色。

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

最后请注意,图像(位图)的指定方式不同,改变这些图像会更加困难。

根据要求的确切性质(即什么空间/颜色构成有效目标),这可能是一项相当漫长的任务,并且需要具有PostScript编程能力的人才能编写它。

哦,最后一点,您是否考虑过透明度?这也可以指定混合颜色空间,这可能意味着在您替换颜色后,它将被混合在不同的颜色空间中,导致您的仔细替换消失。

为了避免您认为我不应该提及许多PDF生产商创建包含透明度组的文件,即使没有实际的透明度操作也会发生。

答案 1 :(得分:0)

您可以尝试以高分辨率进行光栅化并使用 ImageMagick 转换颜色,然后使用 potrace 重新进行矢量化

所以,如果你有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(因为StackOverflow不允许SVG图像AFAIK):

enter image description here

您可以通过编辑SVG使所有PATH成为您喜欢的绿色阴影,如下所示:

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

enter image description here