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 灰度转换仍然包含颜色? 的相关文章

  • 我可以使用 iTextSharp 从现有 PDF 中删除文本对象并输出到新 PDF 吗?

    这个问题是我的旧问题的另一个版本 我想使用 iTextSharp 从 PDF 获取除文本对象之外的所有对象作为图像 https stackoverflow com questions 54003886 i want to get all o
  • 使用 JavaScript 填写 PDF 表单

    这就是我所拥有的 用户填写很长的 html 表单 用户获取下载不同 pdf 的链接 这是可填写的表格 链接是使用 javascript 生成的 用户单击链接 生成 url 使用用户之前提交的数据 在表单中处理数据并完成字段 这是在表单内使用
  • 如何使用PIL将灰度图转为伪彩色?

    我似乎不知道如何获取我的灰度函数并将其更改为给我假颜色 我知道我需要将每种颜色 R G B 分成范围 然后根据每种颜色的范围分配颜色 有谁知道这是如何运作的 def grayscale pic width height pic size f
  • Android - 使用 Intent 打开 PDF 文档关闭后不保存

    我面临的问题是 当尝试保存对使用此 URI 打开的 PDF 文档的更改时内容 xx xxx xxx fileprovider external Download Sync FileName pdf 我所做的任何更改在关闭文档后都不会保存 但
  • 使用 javascript 在 IFrame 中打印 PDF 文件仅获取一页

    这是我打印 pdf 文件的代码 在这里 在打印时我只得到一页 我需要一个解决方案 function printPdf var ifr document getElementById frame1 PDF is completely load
  • 如何在 iOS 上反转使用 CoreGraphics 渲染的 pdf 上的文本颜色?

    我正在使用开源 PDF 查看库 VFR PDF Readerhttps github com vfr Reader https github com vfr Reader 我正在尝试实现 夜间模式 或黑色背景与白色文本 我可以将背景设置为我
  • tesseract 处理后无法获取原始彩色位图 - android

    我使用 android 的 tesseract 库从图像中捕获某些文本 我知道捕获的图像不会保存在任何地方 它会被回收 我需要找到原始的彩色位图 我一直在尝试找到原始的彩色位图 但我所能找到的只是灰度位图 Bitmap bitmap act
  • 如何在服务器(无 GUI)上呈现网页以进行打印?

    我正在尝试使用 PHP 脚本将页面实用地打印到办公室打印机 这是我到目前为止所得到的 我在服务器上安装了一台打印机 我可以通过命令行的打印命令使用 PHP 向其发送作业 我还可以使用 PHP 脚本编写纯文本文件 然后将它们添加到打印提示中
  • 使用 AJAX 调用生成 PDF 文件

    我正在尝试使用 Rails3 中的 AJAX 调用生成 PDF 文件 以下代码生成一个我使用 PRAWN gem 创建的 PDF 文件 我不希望用户在订购之前查看 PDF 因此 目标是在服务器中创建 PDF 文件 非常感谢任何想法或想法 使
  • 如何在 iText PDF 中使用字体

    我有一个java应用程序 我必须在itextPdf中使用FontFactory使用 Bodoni MT Black 字体 我应该如何修改我的代码 这是我的代码 Font base FontFactory getFont FontFactor
  • 从 PDF 转换为 HTML [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • ABCPdf 添加文档 javascript

    是否可以使用 ABCPdf 将文档 JavaScript 添加到生成的 PDF 中 如果你的意思是 在文档加载后执行的Javascript 那么看看本文档页面 http www websupergoo com helppdf8net sou
  • 使用 ApacheFOP 从 Java 中的 XML 生成 PDF

    我正在尝试从 Java 对象生成即时 PDF 报告 我找不到很多这方面的例子 所以我一直在关注这个例子 http svn apache org viewvc xmlgraphics fop trunk examples embedding
  • 显示来自 weburl iphone sdk 的 pdf

    我正在开发一个项目 我想显示网站上的 pdf 我有 pdf 的 url 知道如何做到这一点 我还想创建网站上 pdf 的缩略图 您可以在您的设备中显示 pdf 文件 直接将 url 传递给 UIWebView UIWebView webVi
  • JsPdf 库无法读取 PDF 中的阿拉伯语

    在 pdf 中显示阿拉伯值的代码不起作用 它向我展示了一些我无法理解的奇怪语言 var sm nature name nature1 ar 1 name nature2 ar 2 name nature3 ar 3 name nature4
  • 如何从浏览器打印 PDF

    在Web应用程序中 是否可以强制在客户端上打印PDF文件 如果浏览器配置为在窗口内打开 PDF 我想调用 window print 会起作用 但某些浏览器 例如我的 被配置为在外部打开 PDF 谷歌文档的做法是将 JavaScript 嵌入
  • 如何使用 imagemagick 创建像shutterstock一样的水印

    我想创建像 Shutterstock 一样的图像水印 我已经尝试过但无法复制它 我尝试使用以下命令 对我来说 问题是我无法像 Shutterstock 那样向图像添加对角线随机文本 我尝试了很多选择但没有运气 infile zoom jpg
  • gem install rmagick 在 OS X El Capitan 上失败

    几天前我升级到 El Capitan 并运行了 brew update brew upgrade 它更新了 imagemagick 导致 ruby 的 rmagick gem 停止工作 我想没问题 我就跑 gem install rmagi
  • 如何将div内容添加到jspdf中的新页面?

    如何将div内容添加到jspdf中的新页面 我尝试使用 br 它创建了一个新页面 但我看不到内容 div div style margin 3px 430px First Page div div Place content to Seco
  • 带回形针、导轨的水印图像 4

    我一直在尝试按照中列出的答案向我的图像添加水印带有回形针的水印 https stackoverflow com questions 13517757 watermark with paperclip 水印 rb module Papercl

随机推荐