目前我使用 Ghostscript 彩色 PDF 转换为灰度 PDF 的 。现在我正在寻找可靠的 .NET 商业或非商业组件/库 来替换 ghostscript。我用谷歌搜索,我没有找到任何能够轻松做到这一点或根本做到这一点的组件/库。

编辑 #1:

为什么 Ghostscript 对我不起作用:

我实现了 Ghostscript 并且我正在使用它的原生 API。问题是 Ghostscript 不支持单个进程中的多个解释器实例。 -dJOBSERVER 模式对我也不起作用,因为我不收集所有工作,他们一次处理所有工作。碰巧 Ghostscript 正在处理需要大约 20 分钟的大型作业,同时我得到了一些必须尽快处理的较小作业,不能等待 20 分钟。另一个问题是 Ghostscript 页面处理的事件不容易捕捉。我为 ghostscript 标准输出消息编写了一个解析器,我可以读出处理过的页码,但当它被处理为 ghostscript 为一组处理过的页面推送消息时,我可以读出处理过的页码,但不能读出每个页面。 Ghostscript 还存在其他问题,例如生成错误的 pdf、重复字体问题.....

你可以在这里找到我在 ghostscript 中遇到的另一个问题:Ghostscript - PS to PDF - Inverted images problem

——

更新一年后的 :

一年前,我问了这个问题。后来我使用 iTextSharp 制作了自己的解决方案。

您可以在此处查看将 PDF 转换为灰度的解决方案:

http://habjan.blogspot.com/2013/09/proof-of-concept-converting-pdf-files.html

或者

https://itextsharpextended.codeplex.com/

在大多数情况下对我有用:)

最佳答案

不是一个很好的答案,但我认为您过早地驳回了 Ghostscript。

您是否了解 GhostScript API(用于进程内 Ghostscript)?或者 -dJOBSERVER 模式可以将一系列 PS 命令通过管道传输到其标准中?

但是,这仍然不会让您获得回调,而且它仍然不是多线程的。

如前所述,iText 可以做到,但需要遍历所有内容和图像,寻找非灰度色彩空间并以特定于空间的方式进行转换。

您还必须替换可能找到的任何图像中的像素数据。

好消息是 iText[Sharp] 能够在多个线程中运行,前提是每次从一个线程使用每个文档。

我怀疑建议的商业图书馆也是如此,这不是一个好交易。

然后一盏灯在我头顶亮起……以灰度绘制。

混合模式和透明度组!

获取所有当前页面内容并将其粘贴在一个透明组中,该透明组与覆盖页面的纯黑色矩形混合。我认为 alpha 混合模式甚至有亮度......让我们看看这里。

是的,PDF 引用部分 11.6.5.2“Soft Mask Dictionaries”。你会想要一个“亮度”组。

现在,坏消息。如果您切换到灰度的目标是节省空间,这将完全失败。它实际上会使每个文件更大一点......比如每页 100 字节,给予或接受。

更好地呈现 PDF 的软件也是非常热门的东西。你表弟的本科渲染项目不需要申请。这是这里的高级图形内容,Common PDF Files 很少使用,所以最后一种要实现的东西。

所以...对于每个原始页面

  • 创建一个新页面。
  • 用黑色背景覆盖它。
  • 在透明组中用一个白色矩形覆盖它(之前将其向后),该透明组使用设置为原始页面内容亮度的软蒙版字典(现在隐藏在 XObject 表单中)。

  • 因为这都是您自己的代码,所以您将有充足的机会在每个页面的开头或结尾处执行任何您想做的事情。

    天哪,这真是太疯狂了!它确实需要一些 PDF-Fu,但不像“在我逐步浏览文档时以各种方式转换每个颜色空间和图像”那么多。更深入的知识,更少的代码编写。

    关于c# - 用于彩色 PDF 到灰度转换的 .NET 组件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7612860/

    10-11 08:00