【问题标题】:.NET component for color PDF to grayscale conversion.NET 组件,用于将彩色 PDF 转换为灰度
【发布时间】:2011-11-28 14:19:54
【问题描述】:

目前我使用 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 不再可行吗?
  • 因为在某些情况下它会产生糟糕的 pdf。 (重复的字体等)。另一个原因是我想要更灵活(处理页面事件)并让它运行多线程。

标签: c# .net pdf colors


【解决方案1】:

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

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

【讨论】:

  • 我看到了你的解决方案,“很多情况”听起来不错(我不会说大多数情况),这是一个很好的起点。然而,这个解决方案在很多情况下都不起作用:彩色光栅图像(特别是带有自定义调色板的图像)、使用非标准色彩空间的 PDF 绘图、PDF 注释、PDF XForms、PDF 模式等。
【解决方案2】:

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

【讨论】:

【解决方案3】:

如果商业产品对您来说是一个有效的选择,请允许我推荐 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,但我找不到将项目轻松转换为灰度的方法。无论如何,谢谢你的建议。
【解决方案4】:

不是一个完整的答案,但我认为你解雇 Ghostscript 太快了。

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

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


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

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

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

我怀疑建议的商业图书馆也是这种情况,这不是一个很好的交易。


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

混合模式和透明度组!

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

是的,PDF 参考第 11.6.5.2 节“软蒙版词典”。您需要一个“亮度”组。

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

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

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

  1. 创建一个新页面。

  2. 用黑色背景覆盖它。

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

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

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

【讨论】:

  • 嗨,我知道 Ghostscript API,问题是每个应用程序实例只能初始化一个 ghostscript 实例。 JOBSERVER 模式对我也不起作用,因为我必须在作业到来时处理它们。所以,当我处理需要 20 分钟的大型工作时,我可以再做 3 个工作,这些工作必须等到第一个工作完成。使用 iTextSharp 浏览 pdf 并将内容和图像转换为灰度是复杂的。透明度、阴影、颜色混合可能存在很多问题。
  • 关于你的最后一个建议,如果我使用建议的逻辑,我不知道打印机是否会将 pdf 页面识别为灰度。
  • 事件我不会使用你的逻辑,+100 为你的努力。 ;-)
【解决方案5】:

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

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

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

here 是开源 pdf 库的列表。

【讨论】:

  • 嗨,iText 是 java 库。在 aspose.pdf 中我找不到任何颜色转换功能。谢谢。
【解决方案6】:

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

虚拟打印机安装好后,就可以用c#来‘打印’灰度版了。

编辑:我只记得免费版不是静音的。打印到 CutePDF 打印机后,它会要求您“另存为”。他们确实有可供购买的 SDK,但我不能说它是否能够帮助您转换为灰度。

【讨论】:

  • 感谢您的回答,我已经考虑过这种选项,这里的限制是您不能同时转换超过 1 个 pdf 文档。无论如何,+1 为您提供帮助。谢谢
猜你喜欢
  • 2011-12-28
  • 1970-01-01
  • 2018-07-06
  • 2017-08-19
  • 2016-01-11
  • 2015-10-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多