如何将PDF中的所有颜色更改为赞美?因此,我的意思是在白色背景上由黑色文本组成的文档将更改为由黑色背景上的白色文本组成的文档。文档中的任何红色都将更改为绿松石色等。是否有一些可用于此目的的标准实用程序,或者我可能不得不设计一些尴尬的ImageMagick图像转换?
编辑:这是使用ImageMagick执行此操作的非常手动方式:convert -density 300 -quality 100 "${fileName}" tmp.png
mogrify -flatten *.png
mogrify -negate *.png
convert *.png "${fileName}"_1.pdf
编辑:为了清楚起见,我改变了措辞。
答案 0 :(得分:8)
我可以想到至少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
这很好,Adobe Reader显示我们的out.pdf
(见下文)否定了。但这里的'伟大'结束了。所有其他观众都忽略了 TF ,(可能)认为它与设备有关并且实际上存在于PDF中作为输出设备的特性(非线性打印机响应等)的补偿,因此可以忽略在屏幕上显示PDF时。此外,根据读者的版本,黑白文本的否定会导致黑底白字或黑底黄字。那不是很好。
因此,我们不仅需要 TF 注射,还需要正确应用 TF 的方法
查看之前的PDF内容。并且,无论ps2pdf
Ghostscript的手册如何说:
目前,始终应用传输功能
(有三个选项:Apply,Preserve,Remove)
使用当前的9.10版本,当输出到高级别时,我无法使Ghostscript实际应用 TF (即修改页面描述运算符){{1} },与图像输出相反)设备。也许我在这里遗漏了一些东西。
但是,Adobe Distiller设置了正确的选项, 将 TF 应用于输入postscript文件。
与TF有些相关的是使用反转设备链接颜色配置文件, 这是具有反转(输入或输出)曲线的简单身份 DL配置文件。
这是有趣的技术的有趣使用,但同样,Ghostscript目前不支持PDF-2-PDF工作流程中的正确颜色管理(和DL配置文件)。此外,Adobe Acrobat不知道如何处理DL配置文件,它们在Acrobat中的使用需要昂贵的第三方插件。
如果PDF查看器(渲染器)声称支持1.4和透明度(现在都是这样做的话),这是另一种方法。 PDF参考表示,如果当前混合模式为pdfwrite
并且我们使用白色绘制,则实际上意味着反转背景。所以,我们用白色明确地绘制背景(如果没有背景则没有反转),然后将我们当前的内容(将其视为黑盒子),然后将混合模式设置为Difference
并在上面涂上白色。明白了吗?同样,我没有成功使用Ghostscript设置混合模式,使用:
Difference
它可以与Distiller一起使用但Ghostscript会忽略它。也许(再次)我错过了一些东西。
好的,为了整理(答案有点长),这里是使用适当API的3D方法的Perl解决方案(编程网站,不是它。任何编程语言和适当的API都可以):
[ /BM /Difference /SetTransparency pdfmark
在这里,我将获取一个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,你不需要它。这就是为什么我将组条目添加到页面词典。
答案 1 :(得分:4)
您的问题似乎与此非常相似:
Change background color of pdf
但你也想改变文字的颜色。
所以你可以按照我前段时间建议的工作流程执行相同的任务:
vector pdf背景(意思不是光栅图像)可以是 可以通过几个步骤轻松更改(另请参阅我的stackoverflow回答 现在我将扩展和改进
PRELIMINAR CHECK:
使用能够显示内部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*)
依旧......
(例如,代码片段可以更改为openoffice生成的pdf 内部pdf导出功能,相同的代码片段采用以下形式:
0 0 0 rg (it means *black*)
1 1 1 rg (it means *white*)
依旧......
如果您能够看到这些代码段,那么您可以开始更改 值,否则,您需要解压缩文本流
您可以使用
执行此任务<强> PDFTK 强>
http://www.pdflabs.com/docs/install-pdftk/
pdftk file.pdf output uncompressed.pdf uncompress
并在完成更改后重新压缩
pdftk uncompressed.pdf output recompressed.pdf compress
现在,如果您看到这些代码段,则可以更改值
您需要的第一件事是找到RGB之间的正确对等 文本和背景的颜色值以及内部pdf表示 相同的颜色
因为看起来你是来自第三个星球的窗户居民 在Microsoft星座中,您可以使用像这样的免费颜色选择器
http://www.iconico.com/download.aspx?app=ColorPic&type=free
识别文本和背景颜色的rgb值
一旦有了这些值,就需要转换成特殊的内部pdf 表示
要做到这一点,请记住这个比例:
1:255 = x:您选择的颜色
例如:假设您有背景的RGB三元组:
30,144,255
知道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
所以,pdf中的整个三元组(对应于RGB 30,144,255)将是:
0.117 0.564 1.000
我们在带有记事本++的pdf文件中寻找0.117 0.564 1.000(环绕 和只匹配一个单词需要检查)我们找到了内部 pdf表示背景,我们可以从天蓝色改为,比方说, 白
1.000 1.000 1.000
或
1 1 1
但是,既然你写了黑色背景,更确切地说,我 创建了一个样本pdf,其中包含白色背景和黑色文字
因为我们知道0.000 0.000 0.000 rg
意味着黑色,所以我们会寻找这个
我们可以从0.000 0.000 0.000 rg
更改为1.000 1.000 1.000 rg
(白色)但是......
同时,如果你的文字是黑色的,你想要将它的颜色改为白色,你还需要先将文字从黑色改为其他颜色,否则它将是隐形的,白色为白色
所以,我们不能简单地将白色背景直接改为黑色, 因为这样做,我们在颜色文本和颜色之间没有区别 背景值
然后我们采取以下行动:
我们将白色背景从1.000 1.000 1.000改为
0.5 0.5 0.5 (light grey)
然后寻找
0.000 0.000 0.000 (black text) and change to **white**
1.000 1.000 1.000
生成的中间pdf文件:
最后,我们再次改变背景颜色
0.5 0.5 0.5 (light grey)
黑色
0.000 0.000 0.000
我们现在有一个带有白色文字和黑色背景的矢量pdf
请记住,
1 - 如果你使用pdftk解压缩,再次压缩你修改过的pdf 2 - 修理
pdftk file.pdf output fixed.pdf
还有另一种方法,从postscript开始,执行相同的任务, 但作为一个windowsian,我想后记的方式是更难的方式 对你而言,如果某人(来自Torvald星座的linuxian)是 有兴趣我可以解释后记中的同样的事情
不要在这篇文章中避免过于冗长
请提供反馈,并随时提出更多信息