【问题标题】:Converting PDF to Grayscale pdf using ABC PDF使用 ABC PDF 将 PDF 转换为灰度 pdf
【发布时间】:2017-03-21 07:25:46
【问题描述】:

我正在尝试使用 Websupergoo ABCpdf 将 PDF 转换为灰度(黑白)PDF。
我指的是

http://www.websupergoo.com/helppdfnet/source/8-abcpdf.operations/3-recoloroperation/1-methods/recolor.htm?q=recoloroperation

        Doc theDoc = new Doc();
        theDoc.Read(Server.MapPath("src.pdf"));
        int pages = theDoc.PageCount;
       MyOp.Recolor(theDoc, (WebSupergoo.ABCpdf8.Objects.Page)theDoc.ObjectSoup[theDoc.Page]); //Here problem
      theDoc.Save(Server.MapPath("greyscale1.pdf"));
        theDoc.Clear();

以上代码适用于单页 PDf。

此代码仅转换 PDF 的第一页

当我尝试使用循环时,出现以下错误

【问题讨论】:

  • 当您的问题与其他产品有关时,请不要使用itext 标记您的问题。

标签: abcpdf


【解决方案1】:

页码与abcPDF中的Page不同,因此不能将页码用作对象汤的索引。

试试这样的东西(未经测试):

int pages = theDoc.PageCount;
for(int i=0; i < pages; i++)
{
    theDoc.PageNumber = i;
    MyOp.Recolor(theDoc, (WebSupergoo.ABCpdf8.Objects.Page)theDoc.ObjectSoup[theDoc.Page]);
}

编辑:以上显然不起作用,但正如您链接到的文档所示,有一种方法采用 Doc 对象而不是 Page 对象。如果您将 MyOp.Recolor() 方法更改为此,这应该可以工作:

public class MyOp
{
  public static void Recolor(Doc doc) {
    RecolorOperation op = new RecolorOperation();
    op.DestinationColorSpace = new ColorSpace(doc.ObjectSoup, ColorSpaceType.DeviceGray);
    op.ConvertAnnotations = false;
    op.ProcessingObject += Recoloring;
    op.ProcessedObject += Recolored;
    op.Recolor(doc);
  }
}

我不确定您在 Recoloring() 方法或 Recolored() 方法中正在做什么(或需要做什么),但这对于此处的更改应该无关紧要。

【讨论】:

  • 我使用了相同的代码。此代码仅转换 pdf 的第一页。如果 pdf 包含多个,它将​​不起作用
  • 好的,这与您在上面发布的内容不同。这应该可以解决您遇到的异常,我认为它会起作用。
  • 添加了另一个尝试。 RecolorOperation 上的 Recolor() 方法也可以采用 Doc 对象而不是 Page 对象。
  • 当我通过 theDoc 而不是页面时,它对我有用
  • 太好了,很高兴我能帮上忙。
【解决方案2】:

因为我在这里疯狂地将 PDF 转换为灰度

c# printing through PDF drivers, print to file option will output PS instead of PDF

我找到了上面的答案(谢谢),但需要对每个人都可能需要的情况进行一些更正:

    Doc theDoc = new Doc();

    theDoc.Read("test.pdf");

    //doc.Rendering.ColorSpace = XRendering.ColorSpaceType.Gray;
    //doc.SaveOptions.

    //MyOp.Recolor(theDoc, (Page)theDoc.ObjectSoup[theDoc.Page]);

    int pages = theDoc.PageCount;
    for (int i = 0; i < pages; i++)
    {
        theDoc.PageNumber = i+1; // this is because numbering is from 1 :)
        MyOp.Recolor(theDoc, (Page)theDoc.ObjectSoup[theDoc.Page]);
    }

    theDoc.Save("out.pdf");

    theDoc.Clear();

该类与他们的示例保持一致

   public class MyOp
    {
        public static void Recolor(Doc doc, Page page)
        {
            RecolorOperation op = new RecolorOperation();
            op.DestinationColorSpace = new ColorSpace(doc.ObjectSoup, ColorSpaceType.DeviceGray);
            op.ConvertAnnotations = false;
            op.ProcessingObject += Recoloring;
            op.ProcessedObject += Recolored;
            op.Recolor(page);
        }


            //public static void Recolor(Doc doc)
            //{
            //    RecolorOperation op = new RecolorOperation();
            //    op.DestinationColorSpace = new ColorSpace(doc.ObjectSoup, ColorSpaceType.DeviceGray);
            //    op.ConvertAnnotations = false;
            //    op.ProcessingObject += Recoloring;
            //    op.ProcessedObject += Recolored;
            //    op.Recolor(doc);
            //}


        public static void Recoloring(object sender, ProcessingObjectEventArgs e)
        {
            PixMap pm = e.Object as PixMap;
            if (pm != null)
            {
                ColorSpaceType cs = pm.ColorSpaceType;
                if (cs == ColorSpaceType.DeviceCMYK)
                    e.Cancel = true;
                e.Tag = cs;
            }
        }

        public static void Recolored(object sender, ProcessedObjectEventArgs e)
        {
            if (e.Successful)
            {
                PixMap pm = e.Object as PixMap;
                if (pm != null)
                {
                    ColorSpaceType cs = (ColorSpaceType)e.Tag;
                    if (pm.Width > 1000)
                        pm.CompressJpx(30);
                    else if (cs == ColorSpaceType.DeviceRGB)
                        pm.CompressJpeg(30);
                    else
                        pm.Compress(); // Flate
                }
            }
        }
    }

别忘了使用(不是其他版本),它就像一个魅力。

using WebSupergoo.ABCpdf9.Objects;
using WebSupergoo.ABCpdf9.Operations;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 2011-07-02
    • 2019-03-11
    • 1970-01-01
    • 2016-03-17
    • 2011-11-28
    • 2020-03-07
    相关资源
    最近更新 更多