Ghostscript 灰度转换仍然包含颜色?

2023-12-01

如果 pdf 确实包含颜色,我需要将其转换为灰度。 为此,我找到了一个脚本,可以确定 pdf 是否已经处于灰度状态。

convert "source.pdf" -colorspace RGB -unique-colors txt:- 2> /dev/null \
   | egrep -m 2 -v "#([0-9|A-F][0-9|A-F])\1{3}" \
   | wc -l

这会计算文档中存在多少种具有不同 RGB 值(因此它们不是灰色)的颜色。

如果 pdf 还不是灰度文档,我将使用 Ghostscript 继续进行转换

gs \
  -sOutputFile=temp.pdf \
  -sDEVICE=pdfwrite \
  -sColorConversionStrategy=Gray \
  -dProcessColorModel=/DeviceGray \
  -dCompatibilityLevel=1.4 \
  -dNOPAUSE \
  -dBATCH \
   source.pdf < /dev/null

如果我使用 PDF 查看器打开输出文档,它会正确显示没有颜色。但是,如果我在新生成的文档上尝试第一个脚本,结果发现它仍然包含一些颜色。如何将文档转换为精确的灰度?我需要这个,因为如果我用彩色打印机打印此文档,打印机将使用颜色而不是黑色来打印灰色。


总的来说,我非常看重 ImageMagick——但不信任convert使用您正在使用的命令正确计算颜色...

我可以建议一种不同的方法来发现 PDF 页面是否使用颜色吗?它基于一个(相对较新的)Ghostscript 设备,称为inkcov(您需要 Ghostscript v9.05 或更高版本)。它显示每个单页的 CMYK 墨水覆盖率(对于 RGB 颜色,它会在内部静默转换为 CMYK)。

首先,借助 Ghostscript 生成一个示例 PDF:

gs \
  -o test.pdf \
  -sDEVICE=pdfwrite \
  -g5950x2105 \
  -c "/F1 {100 100 moveto /Helvetica findfont 42 scalefont setfont} def" \
  -c "F1                         (100% 'pure' black)   show showpage" \
  -c "F1 .5 .5 .5   setrgbcolor  (50% 'rich' rgbgray)  show showpage" \
  -c "F1 .5 .5 .5 0 setcmykcolor (50% 'rich' cmykgray) show showpage" \
  -c "F1 .5         setgray      (50% 'pure' gray)     show showpage"

While all这些页面在人眼看来根本不使用任何颜色,第 2 页和第 3 页确实将其表观灰度值与颜色混合在一起。

现在检查每个页面的墨水覆盖率:

gs  -o - -sDEVICE=inkcov test.pdf 
 [...]
 Page 1
 0.00000  0.00000  0.00000  0.02230 CMYK OK
 Page 2
 0.02360  0.02360  0.02360  0.02360 CMYK OK
 Page 3
 0.02525  0.02525  0.02525  0.00000 CMYK OK
 Page 4
 0.00000  0.00000  0.00000  0.01982 CMYK OK

(值 1.00000 映射到相应颜色通道的 100% 墨水覆盖率。因此0.02230结果的第一行意味着2.23 %页面区域的面积被黑色墨水覆盖。)因此 Ghostscript 给出的结果inkcov正是预期的:

  • 第 1 + 4 页不使用 C(青色)、M(洋红色)、Y(黄色)中的任何一种颜色,而仅使用 K(黑色)。
  • 第 2 + 3 页确实使用了 C(青色)、M(品红色)、Y(黄色)颜色的墨水,但根本没有使用 K(黑色)。

现在让我们转换原始 PDF 的所有页面以使用DeviceGray色彩空间:

gs \
 -o temp.pdf \
 -sDEVICE=pdfwrite \
 -sColorConversionStrategy=Gray \
 -sProcessColorModel=DeviceGray \
  test.pdf

...并再次检查墨水覆盖率:

gs -q  -o - -sDEVICE=inkcov temp.pdf
 0.00000  0.00000  0.00000  0.02230 CMYK OK
 0.00000  0.00000  0.00000  0.02360 CMYK OK
 0.00000  0.00000  0.00000  0.02525 CMYK OK
 0.00000  0.00000  0.00000  0.01982 CMYK OK

再次强调,如果颜色转换成功,这正是预期的结果! (顺便说一句,你的convert命令返回2对我来说,这两个文件的[原始]test.pdf以及[灰度转换]temp.pdf——所以这个命令不可能是正确的......)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ghostscript 灰度转换仍然包含颜色? 的相关文章

  • ImageMagick,Q8 与 Q16 的实际含义是什么?

    在Windows下 我需要在Q8和Q16之间进行选择 我知道 Q8 是每像素 8 位分量 例如 8 位红色 8 位绿色等 而 Q16 是每像素 16 位分量 我还知道 Q16 使用的内存是 Q8 的两倍 因此 我必须慎重选择 什么是每像素
  • 为什么调用 istream::tellg() 会影响我的程序的行为?

    我正在尝试将 24 位位图图像转换为灰度图像 include
  • 使用 ps2pdf (ghostscript) 创建正确的 PDF/X

    我已经为此苦苦挣扎了几天 所以我想我应该在这里寻求帮助 基本上 我尝试使用 ps2pdf 版本 9 10 创建正确的 PDF X 1 和 PDF X 3 文档 是的 我知道据说 ps2pdf 仅支持 PDF X 3 请参阅这个线程 http
  • 消除 ffmpeg 和 image-magic 命令中的慢速因素

    这些命令的基本思想是创建一个比较 比较定义了过去的一张 jpeg 和现在的一张 jpeg 组合起来 例如它们将相互滑动并显示前后图像 e g https media evercam io v1 cameras 1lowe scnoe com
  • Linux:命令行实用程序将 RTF 转换为 PDF?

    有什么建议可以将 RTF 转换为 PDF 吗 我需要从 LAMP 应用程序执行此操作 因此像 GhostScript 这样的命令行实用程序将是理想的选择 或者 您可以使用 libreoffice 来完成此任务 libreoffice hea
  • 如何使用回形针对多页 pdf 进行缩略图

    我想让 Paperclip 为上传的多页 PDF 文件的每一页创建 2 个缩略图 我正在运行 Paperclip 2 3 1 1 并在我的资产模型中使用它 has attached file asset styles gt medium g
  • ImageMagick 调整大小 - 设置横向和纵向图像的宽度

    我正在尝试将图像调整为给定宽度 按比例调整高度 无论图像是横向还是纵向 我有两张图像我测试了 ImageMagickconvert resize根据我所读到的命令 我希望以下内容适用于任何类型的图像 convert source jpg r
  • Grails 渲染 PDF 文件

    我正在尝试在网页中呈现 PDF 文件 但使用以下语法时 我得到了一个奇怪的字符组合 render file new File path to file pdf fileName myPdfFile pdf 有谁知道除了上面的行之外我还需要添
  • C# 3.0 使用MemoryStream将itextsharp pdf保存到数据库

    我正在尝试将 itextsharp 生成的 pdf 文件保存到数据库 但是 到目前为止我还没有成功 我正在使用 Linq to sql 这是代码 MemoryStream ms new MemoryStream Document d new
  • 图像魔法叠加图像

    我有两个图像 一个是叠加图像 比如说具有透明度的图像 A 另一个是图像 B 我必须将叠加图像 A 放在图像 B 上 以便通过图像 A 的透明部分可以看到图像 B 的某些部分 我还必须根据一些参数移动图像B 我怎样才能用image magic
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 主目录 不允许下载媒体

    尝试将 PDF 文件保存在下载目录中 但之后getExternalStoragePublicDirectory在 Android Q 后完全弃用 无法将文件保存在 DCIM 或 Pictures 文件夹之外的任何其他位置 因为尝试在此处保存
  • 使用 Tabula 通过 Python 读取 pdf 时出现 Java 错误

    我已经安装了 tabula 库 用于使用 python 将 pdf 读取到 pandas 数据框中 但是当我运行代码时 import tabula df tabula read pdf sample1 pdf pages 1 我得到了例外
  • 如何使用 JMagick 转换色彩空间?

    如何使用 JMagick API 转换色彩空间 例如 CMYK gt RGB 和 RGB gt CMYK None
  • meteorjs 中的 imagemagick (在流星路由器和光纤的帮助下)

    我无法在meteorjs 中使用imagemagick 我正在开发一个小型 svg gt png 转换器 其中包含一个 REST API 来提供转换后的图像 我用meteor router实现了其余的api imagemagick 转换有效
  • 使用 PHP 将值插入可编辑 PDF,并保持可编辑状态

    我有一个带有可编辑字段的 PDF 我希望将 HTML 表单中的值传递到此 PDF 中 我尝试过使用 FPDF 并且它有效 但是将值传递到 PDF 后 pdf 中的字段不再可编辑 另一个缺点是 在将值传递到 PDF 时 我们必须为每个字段指定
  • 是否可以修改 PDF 表单字段名称?

    情况是这样的 我有一个 PDF 其中包含自动生成的 pdf 表单字段名称 问题是这些名称不太用户友好 它们看起来像 topmostSubform 0 Page1 0 Website Address 0 我希望能够更改它们 使它们类似于 We
  • 如何使用文件输入在PDFJS中打开本地PDF?

    我想知道是否有办法使用选择pdf文件input type file 并使用打开它PDFJS https github com mozilla pdf js 您应该能够使用 FileReader 来获取文件对象的内容作为类型化数组 pdfjs
  • imagemagick 不会删除 tmp 文件

    我有一个使用 Carrierwave S3 和 rmagci 的应用程序 或多或少以下http railscasts com episodes 253 rierwave file uploads http railscasts com ep
  • 如何将目录及其子目录中的所有 PDF 文件复制到一个位置?

    如何全部复制PDF文件从目录及其子目录到单个目录 实际上还有更多的文件 并且深度有些任意 假设四个目录的最大深度是公平的 我想这些文件需要重命名 如果a pdf例如 位于多个目录中 因为我会adding https ebooks stack

随机推荐