使用 ABC PDF 将 PDF 转换为灰度 pdf
Converting PDF to Grayscale pdf using ABC PDF
我正在尝试使用 Websupergoo ABCpdf 将 PDF 转换为灰度 (Black/White) PDF。
我指的是
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 的第一页
当我尝试使用循环时出现以下错误
页码与 abcPDF 中的页面不同,因此您不能将页码用作对象汤的索引。
尝试这样的事情(未经测试):
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 转换为灰度
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();
class 与示例中的一样
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;
我正在尝试使用 Websupergoo ABCpdf 将 PDF 转换为灰度 (Black/White) PDF。
我指的是
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 的第一页
当我尝试使用循环时出现以下错误
页码与 abcPDF 中的页面不同,因此您不能将页码用作对象汤的索引。
尝试这样的事情(未经测试):
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 转换为灰度
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();
class 与示例中的一样
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;