用于将彩色PDF转换为灰度的.NET组件

4
目前我使用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

-

UPDATE 一年后:

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

你可以在这里查看将 PDF 转换为灰度的解决方案:

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

或者

https://itextsharpextended.codeplex.com/

在大多数情况下,这对我有效 :)


2
http://blog.stackoverflow.com/2010/11/qa-is-hard-lets-go-shopping/ - Hans Passant
我把问题改成了商业或非商业。现在可以了吗?我认为这个问题放在了正确的位置。 - HABJAN
你能告诉我们为什么Ghostscript不再可行吗? - Mark Ransom
2
因为在某些情况下它会产生不良的 PDF(重复字体等),另一个原因是我想更灵活地处理页面事件,并使其运行多线程。 - HABJAN
6个回答

3

这不算是一个答案,但我认为你过早地否定了Ghostscript。

您是否知道GhostScript API(用于进程内Ghostscript)?还是-dJOBSERVER模式,可以接受一系列PS命令管道传输到其标准输入流中?

然而,这仍然无法获得回调,并且它仍然不是多线程的。


如先前所述,iText 可以 实现,但这将需要遍历所有内容和图像,查找非灰度颜色空间并以空间特定方式进行转换。

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

好消息是iText [Sharp]能够在多个线程中操作,只要每个文档每次从一个线程中使用。

我怀疑对于建议的商业库也是如此,这并不是那么划算。


然后在我的头顶上亮起了一盏灯...以灰阶绘制。

混合模式和透明组!

将所有当前页面内容放入与覆盖页面的实心黑色矩形混合的透明组中。我认为甚至有一种亮度到透明混合模式...看看这里。

是的,PDF参考部分11.6.5.2“软掩模词典”。您将需要一个“亮度”组。

现在,不好的消息。如果您转换为灰度的目标是节省空间,则这将彻底失败。它实际上会使每个文件稍微变大...每页大约100字节左右。

渲染PDF的软件也应该非常出色。您的堂兄的本科渲染项目无需申请。这里有高级图形处理内容,常见PDF文件很少使用,因此实现起来非常困难。

因此...对于每个原始页面

  1. 创建新页面。

  2. 用黑色背景覆盖它。

  3. 用透明组中设置为原始页面内容的亮度(现在存储在XObject Form中)的软掩模词典中的白色矩形覆盖它。

因为这是您自己的代码,所以您将有充足的机会在每个页面的开始或结束时执行您想要执行的任何操作。

天哪,这就足够疯狂了!它确实需要一些PDF-Fu,但不需要像“在我浏览文档时将每个颜色空间和图像进行各种转换”那样多。深入的知识,要写的代码更少。


嗨,我知道Ghostscript API,但问题在于每个应用程序实例只能初始化一个Ghostscript实例。JOBSERVER模式对我也不起作用,因为我必须按照它们到来的顺序处理作业。因此,在我处理需要20分钟的大型作业的同时,我可能会得到3个更多的作业,这些作业必须等待第一个作业完成。使用iTextSharp遍历PDF并将内容和图像转换为灰度是复杂的。透明度、阴影、颜色混合可能会出现很多问题。 - HABJAN
关于您的最后一个建议,我不知道如果我使用建议的逻辑,打印机是否会将PDF页面识别为灰度。 - HABJAN
事件i不会使用你的逻辑,但为你的努力加100分。;-) - HABJAN

2
这不是一个 .net 库,而是一种潜在的解决方法。您可以安装一个能够编写 PDF 文件的虚拟打印机。我建议使用 CutePDF,因为它是免费的、易于使用的,并且能够将大量文件格式转换为 PDF。您几乎可以使用 CutePDF 做任何事情,包括打印灰度图像。
安装虚拟打印机后,您可以使用 c# 打印灰度版本。
编辑:我刚想起来免费版不是静默的。一旦您打印到 CutePDF 打印机,它会要求您“另存为”。他们提供了一个可购买的 SDK,但我无法确定它是否能帮助您转换为灰度。

谢谢你的回答,我已经考虑过这种选择了。但是限制在于你不能同时转换超过1个PDF文档。无论如何,感谢你的帮助。谢谢。 - HABJAN

1

如果商用产品对您来说是一个有效的选项,我建议您使用Amyuni PDF Creator .Net。通过使用它,您将能够枚举页面内的所有项目并相应地更改它们的颜色,还可以将图像设置为灰度。

通常的免责声明适用

使用Amyuni PDF Creator ActiveX的示例代码,.Net版本类似:

        pdfdoc.ReportState = ReportStateConstants.acReportStateDesign;
        object[] page_items = (object[])pdfdoc.get_ObjectAttribute("Pages[1]", "Objects");

        string[] color_attributes = new string[] { "TextColor", "BackColor", "BorderColor", "StrokeColor" };
        foreach (acObject page_item in page_items)
        {
            object _type = page_item["ObjectType"];
            if ((ACPDFCREACTIVEX.ObjectTypeConstants)_type == ACPDFCREACTIVEX.ObjectTypeConstants.acObjectTypePicture)
            {
                page_item["GrayScale"] = true;
            }
            else
                foreach (string attr_name in color_attributes)
                {
                    try
                    {
                        Color color = System.Drawing.ColorTranslator.FromWin32((int)page_item[attr_name]);
                        int grayColor = (int)(0.3 * color.R + 0.59 * color.G + 0.11 * color.B);
                        int newColorRef = System.Drawing.ColorTranslator.ToWin32(Color.FromArgb(grayColor, grayColor, grayColor));
                        page_item[attr_name] = newColorRef;
                    }
                    catch { } //not all items have all kinds of color attributes
                }
        }

我看到了Amyuni PDF Creator,但我找不到一种轻松转换项目为灰度的方法。无论如何,谢谢建议。 - HABJAN

1

我看了你的解决方案,对于“许多情况”来说听起来不错(我不会说是大多数情况),这是一个不错的起点。但是,就目前而言,这个解决方案有很多情况下是行不通的:颜色栅格图像(特别是使用自定义调色板的图像)、使用非标准颜色空间的PDF绘图、PDF注释、PDF XForms、PDF图案等。 - yms

0

iTextPdf 是一个创建/管理 PDF 的好产品,它有商业版和免费版。

看看 aspose.pdf for .net 它提供以下功能和更多。

  • 添加和删除 PDF 文档中的水印
  • 设置 PDF 文档的页面边距、大小、方向、转换类型、缩放因子和外观
  • ..

这里 是一份开源 PDF 库列表。


你好,iText 是 Java 库。在 aspose.pdf 中我找不到任何颜色转换功能。谢谢。 - HABJAN

0
经过大量调查,我发现了WebsupergooABCpdf。他们的组件可以通过简单调用Recolor方法轻松将任何PDF页面转换为灰度。该组件是商业软件。

xfinium-pdf也被认为是重新着色的最佳和简单的选择。(http://www.xfiniumpdf.com/xfinium-pdf-wpf-silverlight-winrt/xfinium-pdf-features.html) - Jay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接