d3p*_*3pd 6 pdf imagemagick invert
如何将PDF中的所有颜色更改为赞美?因此,我的意思是在白色背景上由黑色文本组成的文档将更改为由黑色背景上的白色文本组成的文档.文档中的任何红色都将更改为绿松石色等.是否有一些可用于此目的的标准实用程序,或者我可能不得不设计一些尴尬的ImageMagick图像转换?
编辑:这是使用ImageMagick执行此操作的非常手动的方法:
convert -density 300 -quality 100 "${fileName}" tmp.png
mogrify -flatten *.png
mogrify -negate *.png
convert *.png "${fileName}"_1.pdf
Run Code Online (Sandbox Code Playgroud)
编辑:为了清楚起见,我改变了措辞.
我可以想到至少3种方法来反转(否定,称赞)PDF页面描述的颜色 - 我的意思是将页面内容视为黑盒子,因此不计算直接潜入页面内容并根据Dingo的答案弄乱.不幸的是,现成的免费工具(主要是Ghostscript)提供了不完整的解决方案,需要人工干预.
请注意,下面使用的所有特定术语至少需要一些PDF和Postscript语言参考基础知识,这里有点简化,请参阅手册或谷歌进行详细说明.
最明显的方法是使用反转传递函数.传递函数(TF)期望0..1范围内的参数是(加法)颜色分量,并且也返回颜色值.当然,否定TF是{1 sub neg}很容易注入的:
gs -q -sDEVICE=pdfwrite -o out.pdf -c '{1 sub neg} settransfer' -f in.pdf
Run Code Online (Sandbox Code Playgroud)
这很好,Adobe Reader显示我们的out.pdf(见下文)否定.但这里的'伟大'结束了.所有其他观众都忽略了TF,(可能)认为它与设备有关并且实际上存在于PDF中作为输出设备的特性(非线性打印机响应等)的补偿,因此在屏幕上显示PDF时需要忽略.此外,根据读者的版本,黑白文本的否定会导致黑底白字或黑底黄字.这并不好.
因此,我们不仅需要TF注入,还需要在查看之前正确应用TF到PDF内容的方法.并且,无论ps2pdfGhostscript的手册如何说:
目前,始终应用传递函数
(有三个选项:Apply,Preserve,Remove)
使用当前的9.10版本,当输出到高级(与图像输出相反)设备时,我无法使Ghostscript实际应用 TF(即修改页面描述操作符)pdfwrite.也许我在这里遗漏了一些东西.
但是,具有适当选项集的Adobe Distiller 确实将TF应用于输入postscript文件.
与TF有些相关的是使用反转的设备链接颜色配置文件,这是具有反转(输入或输出)曲线的简单身份 DL配置文件.
这是有趣的技术的有趣使用,但同样,Ghostscript目前不支持PDF-2-PDF工作流程中的正确颜色管理(和DL配置文件).此外,Adobe Acrobat不知道如何处理DL配置文件,它们在Acrobat中的使用需要昂贵的第三方插件.
如果PDF查看器(渲染器)声称支持1.4和透明度(他们现在都这样做),这是另一种方法.PDF参考说,如果当前的混合模式是Difference和我们用白色绘画,它实际上意味着反转背景.因此,我们明确地用白色绘制背景(如果没有背景则没有任何内容可以反转),然后将我们当前的内容(将其视为黑盒子),然后将混合模式设置为Difference顶部并用白色绘制.明白了吗?同样,我没有成功使用Ghostscript设置混合模式,具有:
[ /BM /Difference /SetTransparency pdfmark
Run Code Online (Sandbox Code Playgroud)
它适用于Distiller,但被Ghostscript忽略.也许(再次)我错过了一些东西.
好的,为了整理(答案有点长),这里是使用适当的API(编程站点,不是它的3D方法的Perl解决方案.任何编程语言和适当的API都可以):
use strict;
use warnings;
use PDF::API2;
use PDF::API2::Basic::PDF::Utils;
my $pdf = PDF::API2->open('adobe_supplement_iso32000.pdf');
for my $n (1..$pdf->pages()) {
my $p = $pdf->openpage($n);
$p->{Group} = PDFDict();
$p->{Group}->{CS} = PDFName('DeviceRGB');
$p->{Group}->{S} = PDFName('Transparency');
my $gfx = $p->gfx(1); # prepend
$gfx->fillcolor('white');
$gfx->rect($p->get_mediabox());
$gfx->fill();
$gfx = $p->gfx(); # append
$gfx->egstate($pdf->egstate->blendmode('Difference'));
$gfx->fillcolor('white');
$gfx->rect($p->get_mediabox());
$gfx->fill();
}
$pdf->saveas('out.pdf');
Run Code Online (Sandbox Code Playgroud)
在这里,我将获取一个Adobe文档并将其反转.

重要的是:页面应该具有明确设置为RGB的透明度混合空间,因为Adobe Reader默认为CMYK,并且您可能不希望在CMYK中反转颜色.纯CMYK黑色0-0-0-100反转为100-100-100-0,那也是(几乎)黑色.RGB黑色提供了70-60-50-70 CMYK,可以反转为棕色30-40-50-30,你不需要它.这就是为什么我将组条目添加到页面词典.
您的问题似乎与此非常相似:
但您还想更改文本的颜色。
所以你可以按照我前段时间建议的工作流程来完成同样的任务:
pdf 文件中的矢量pdf 背景(意味着不是光栅图像)可以通过几个步骤轻松更改(另请参阅我的 stackoverflow 答案,现在我将对其进行扩展和改进
初步检查:
使用能够显示内部 pdf 结构的编辑器打开您的 pdf 文件,例如
记事本++ - http://notepad-plus-plus.org/download/v6.1.8.html
并验证您是否可以看到类似的代码片段
0.000 0.000 0.000 rg (it means *black*)
1.000 1.000 1.000 rg (it means *white*)
Run Code Online (Sandbox Code Playgroud)
等等...
(代码片段可以更改,例如,在由 openoffice 内部 pdf 导出功能生成的 pdf 中,相同的代码片段采用以下形式:
0 0 0 rg (it means *black*)
1 1 1 rg (it means *white*)
Run Code Online (Sandbox Code Playgroud)
等等...
如果你能看到这些代码片段,那么你就可以开始改变值,否则,你需要解压文本流
您可以执行此任务
pdftk
http://www.pdflabs.com/docs/install-pdftk/
pdftk file.pdf output uncompressed.pdf uncompress
Run Code Online (Sandbox Code Playgroud)
并在完成更改后重新压缩
pdftk uncompressed.pdf output recompressed.pdf compress
Run Code Online (Sandbox Code Playgroud)
现在,如果您看到这些代码片段,您可以更改值
您需要做的第一件事是找到文本和背景的 RGB 颜色值与相同颜色的内部 pdf 表示之间的正确等价关系
由于您似乎是来自 Microsoft 星座中第三颗行星的 windows 居民,您可以使用这样的免费颜色选择器
http://www.iconico.com/download.aspx?app=ColorPic&type=free
识别文本和背景颜色的 rgb 值
一旦你有了这些值,你需要转换成特殊的内部 pdf 表示
要做到这一点,我介意这个比例:
1:255=x:您选择的颜色
例如:假设您有这个 RGB 三元组作为背景:
30,144,255
Run Code Online (Sandbox Code Playgroud)

要知道 pdf 中的对应值以便在代码片段中插入以更改 pdf 背景颜色,您可以:(您可以使用 http://www.wolframalpha.com/ 进行精确计算)
1:255=x:30 = 30/255 = 0.117 (approximated to first three decimals)
1:255=x:144 = 144/255 = 0.564 (approximated to first three decimals)
1:255=x:255 = 255/255 = 1
Run Code Online (Sandbox Code Playgroud)
因此,对应于 RGB 30,144,255 的 pdf 中的整个三元组将是:
0.117 0.564 1.000
我们用notepad ++在pdf文件中寻找0.117 0.564 1.000(只需要检查一个单词的环绕 和匹配),我们找到了背景的内部pdf表示,我们可以从天蓝色变成白色
1.000 1.000 1.000
Run Code Online (Sandbox Code Playgroud)
或者
1 1 1
Run Code Online (Sandbox Code Playgroud)
但是,由于您写的是黑色背景,更准确地说,我创建了一个带有白色背景和黑色文本的示例 pdf

因为我们知道这 0.000 0.000 0.000 rg意味着black,所以我们寻找这个,我们可以从0.000 0.000 0.000 rg, 改为1.000 1.000 1.000 rg
(white) 但是...
同时,如果您的文本是黑色的,并且您想将其颜色更改为白色,则还需要先将文本从黑色更改为其他颜色,否则它将不可见,白底白字
因此,我们不能立即将白色背景直接更改为黑色,因为这样做,我们在颜色文本和背景值之间没有区别
然后我们的行为如下:
我们将白色背景从 1.000 1.000 1.000 更改为类似
0.5 0.5 0.5 (light grey)
Run Code Online (Sandbox Code Playgroud)

然后寻找
0.000 0.000 0.000 (black text) and change to **white**
1.000 1.000 1.000
Run Code Online (Sandbox Code Playgroud)
生成的中间pdf文件:

最后,我们再次改变背景的颜色
0.5 0.5 0.5 (light grey)
Run Code Online (Sandbox Code Playgroud)
变黑
0.000 0.000 0.000
我们现在有一个带有白色文本和黑色背景的矢量 pdf

请记住
1 - 如果您使用 pdftk 解压缩,请再次压缩您修改过的 pdf 2 - 修复
pdftk file.pdf output fixed.pdf
Run Code Online (Sandbox Code Playgroud)

还有另一种方法,从 postscript 开始,执行相同的任务,但作为一个 windowsian,我想 postscript 方法对你来说是更难的方法,但如果有人(来自 Torvald 星座的 linuxian)感兴趣,我可以解释怎么做后记中同样的事情
不在这篇文章中,以免过于冗长
请提供反馈,并随时询问更多