pdf - 如何将PDF中的所有颜色更改为它们各自的免费颜色;如何使PDF阴性

标签 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

编辑:为了清楚起见,我更改了措辞。

最佳答案

我可以想到至少三种反转(抵消,称赞)PDF页面描述颜色的方法-我的意思是将页面内容视为黑匣子,因此不算直接跳入页面内容并按照Dingo的回答搞乱。不幸的是,现成的免费工具(主要是Ghostscript)提供了不完整的解决方案,需要人工干预。

请注意,下面使用的所有特定术语至少需要 PDF Postscript语言引用的基础知识,在此处以简化的形式提供,请引用手册或google进行全面描述。

  • 最明显的方法是使用反转传递函数。转移
    函数( TF )需要范围为0..1的参数(是(加和)颜色)
    组件,并且也返回颜色值。否定 TF 当然是{1 sub neg},并且很容易注入(inject):
    gs -q -sDEVICE=pdfwrite -o out.pdf -c '{1 sub neg} settransfer' -f in.pdf
    

    太好了,Adobe Reader将我们的out.pdf显示为否定(如下所示)。但是,“伟大”在这里结束了。所有其他查看者都忽略 TF ,(可能)认为它与设备有关,并且实际上以PDF的形式出现,以补偿输出设备的特殊性(非线性打印机响应等),因此在显示PDF时应忽略一些内容,屏幕。此外,根据读者的版本,黑白文本的否定会导致黑白文本或淡黄色文本。那不是很好。

    因此,我们不仅需要 TF 注入(inject),还需要适本地将 TF 应用于
    查看之前的PDF内容。并且,不管ps2pdf Ghostscript的手册说什么:

    Currently, the transfer function is always applied



    (三个选项:应用,保留,删除)

    使用当前的9.10版本,当输出到高级(pdfwrite,与图像输出相反)设备时,我无法使Ghostscript实际应用 TF (即,修改页面描述运算符)。也许我在这里错过了一些东西。

    但是,Adobe公司的蒸馏器,用正确的选项设置,并申请 TF 输入PostScript文件。
  • 与TF有关的一点是使用反转的设备链接颜色配置文件
    它们是具有反相(输入或输出)曲线的简单标识DL轮廓。

    那是有趣技术的有趣用法,但是同样,Ghostscript当前在PDF-2-PDF工作流程中不支持正确的颜色管理(和DL配置文件)。而且,Adobe Acrobat不知道如何处理DL配置文件,在Acrobat中使用它们需要昂贵的第三方插件。
  • 如果PDF查看器(渲染器)声称支持1.4和透明度(如今都支持),那是另一种方法。 PDF引用说,如果当前的混合模式Difference并且我们用白色绘制,则实际上意味着反转背景。因此,我们显式地将背景涂成白色(如果没有背景,则没有任何内容可反转),然后放入我们的当前内容(将其处理为黑盒),然后将混合模式设置为Difference,并在顶部涂上白色。明白了吗?同样,我没有成功使用Ghostscript设置Blending Mode,具有:
    [ /BM /Difference /SetTransparency pdfmark 
    

    它在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');
    

    在这里,我获取一份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中的所有颜色更改为它们各自的免费颜色;如何使PDF阴性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20584228/

    相关文章:

    python - 如何在 matplotlib 中的 pdf 上显示图例而不与某些图形的 x 轴重叠?

    image-processing - 以编程方式将扫描图像划分为单独的图像

    c - 无法创建会反转字符串的程序

    ios - 使用多点连接快速发送 PDF

    Python PDFMiner 错误 : "No/Root object! - Is this really a PDF?"

    android - 从适用于 Android 的 Adob​​e AIR native 扩展启动 Activity

    ruby-on-rails - sh : identify: command not found imagemagick rails 3

    image-processing - 尝试在 PNG 周围添加描边,可以改进吗?

    scala - 如何反转/翻转/反转/交换 scala 的选项?