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

时间:2011-09-30 15:44:11

标签: c# .net pdf colors

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

编辑#1:

为什么Ghostscript不适合我:

我实现了Ghostscript,我正在使用它的原生API。问题是Ghostscript不支持单个进程中的多个解释器实例。 -dJOBSERVER模式对我来说也不起作用,因为我没有收集所有工作,而是一次性处理它们。碰巧Ghostscript处理大型工作需要大约20分钟,同时我得到一些较小的工作,必须尽快处理,不能等待20分钟。其他问题是Ghostscript页面处理的事件不容易被捕获。我为ghostscript stdout消息编写了一个解析器,我可以读出已处理的页码,但是当它被处理为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/

在大多数情况下适合我:)

6 个答案:

答案 0 :(得分:3)

不是一个答案,但我认为你过快地解雇了Ghostscript。

您是否了解GhostScript API(针对进程内Ghostscript)?或者-dJOBSERVER模式可以将一系列PS命令传送到其标准中吗?

然而,仍然不会让你得到你的回调,它仍然没有多线程。


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

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

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

我怀疑建议的商业图书馆也是如此,这并不是一件好事。


然后我的头顶上有一盏灯......以灰度绘制。

混合模式和透明度组!

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

是的,PDF参考部分11.6.5.2“软掩码字典”。你需要一个“光度”小组。

现在,坏消息。如果你切换到灰度的目标是节省空间,那么这将彻底失败。它实际上会使每个文件变得更大......每页说100个字节,给予或接受。

渲染PDF的软件也是非常热门的东西。你堂兄的本科渲染项目不需要申请。这是高级图形内容,常见的PDF文件使用,所以最后一种事情要实现。

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

  1. 创建新页面。

  2. 用黑色背景覆盖。

  3. 在透明组中用白色矩形覆盖它(之前向前),使用软掩码字典设置为原始页面内容的亮度(现在以XObject格式存储)。

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

    通过高兴,这真是疯狂到工作!它确实需要一些PDF-Fu,但几乎不像“逐步浏览文档时以各种方式转换每个颜色空间和图像”。更深入的知识,更少的代码编写。

答案 1 :(得分:2)

这不是.net库,而是潜在的解决方法。您可以安装能够写入PDF文件的虚拟打印机。我建议使用CutePDF,因为它是免费的,易于使用,并且可以很好地将大量文件格式“打印”为PDF。您可以使用普通打印机对CutePDF执行几乎所有操作,包括打印到灰度。

安装虚拟打印机后,您可以使用c#“打印”灰度版本。

编辑:我记得免费版本没有沉默。打印到CutePDF打印机后,它会要求您“另存为”。他们有可以购买的SDK,但我不知道它是否能够帮助您转换为灰度。

答案 2 :(得分: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
                }
        }

答案 3 :(得分:1)

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

您可以在此处查看将PDF转换为灰度解决方案:https://itextsharpextended.codeplex.com/

答案 4 :(得分:0)

iTextPdf用于创建/管理pdf的好产品,它既有商业版本,也有免费版本。

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

  • 在PDF文档中添加和删除水印
  • 设置页面边距,大小,方向,过渡类型,缩放系数和PDF文档的外观
  • ..

here是一个开源pdf库列表。

答案 5 :(得分:0)

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