C# 更改现有PDF中的元素颜色

C# 更改现有PDF中的元素颜色,c#,.net,pdf,pdfsharp,C#,.net,Pdf,Pdfsharp,使用PdfSharp.NET,我想加载一个现有的PDF文件,并将所有具有特定颜色的元素更改为不同的颜色 直觉告诉我,它需要循环遍历PDF文档中的每个元素,然后更改颜色属性,但我无法找到在哪里循环遍历所有元素,更不用说它们上的颜色属性了 这在PDF sharp中是可能的吗?如果可能的话,我会怎么做?如果你试图用PDF sharp这样做,你会受到伤害。查看此线程以了解原因: PDF Sharp允许您访问PDF的构建块(Adobe在其库中称之为COS层),但它不构建页面上对象的图形表示 因此,您需要

使用PdfSharp.NET,我想加载一个现有的PDF文件,并将所有具有特定颜色的元素更改为不同的颜色

直觉告诉我,它需要循环遍历PDF文档中的每个元素,然后更改颜色属性,但我无法找到在哪里循环遍历所有元素,更不用说它们上的颜色属性了


这在PDF sharp中是可能的吗?如果可能的话,我会怎么做?

如果你试图用PDF sharp这样做,你会受到伤害。查看此线程以了解原因:

PDF Sharp允许您访问PDF的构建块(Adobe在其库中称之为COS层),但它不构建页面上对象的图形表示

因此,您需要进入包含页面所有PDF图形元素的文本流,将此文本解释为实际的对象定义,找出要更改的对象以及这些对象的着色说明,并在必要时进行更改。这绝非小事

为了让您了解您将使用什么,您必须解释如下内容:

q
0 g
0 G    
0 0 200 100 re
1 0 0 0 k
(Hi!) T*
Q   
事实上,事情要比简单地为每个页面读取这些类型的文本字符串稍微复杂一些,因为页面可以(而且经常)包含“表单”,然后您必须在PDF中找到这些表单,并执行与相同的步骤


不想让你失望,但是这确实是一个非常复杂的任务,一个不支持图形元素解析的库。

如果你考虑其他库的用法,那么请看。免责声明:我是作者

您可以像这样检查和更改颜色:

  • 基于复制页面对象
  • 修改setBrush和setPen方法,如下所示:
    if(颜色!=null)
    dst.Color=getReplacement(颜色);
    ...
    //根据您的要求实施getReplacement方法
    专用静态PdfColor getReplacement(PdfColor颜色)
    {
    //将纯红色RGB颜色替换为绿色
    if(颜色为PdfRgbColor rgb)
    {
    如果(rgb.R==255&&rgb.G==0&&rgb.B==0)
    返回新的PdfRgbColor(0,255,0);
    }
    返回颜色;
    }
    
  • 如果还需要更改图像对象中的颜色,则需要在
    target.DrawImage(image.image,0,0,0)之前保存、更改和替换图像行。就像这样:
    
    string fileName=image.image.Save(…);
    //更改“文件名”图像中的颜色。
    //例如:https://stackoverflow.com/questions/17208254/how-to-change-pixel-color-of-an-image-in-c-net
    string replacementImage=ChangeImageColor(文件名);
    image.image.ReplaceWith(replacementImage);
    
  • 以下是将矢量路径和文本对象中的(255,0,0)颜色替换为(0,255,0)颜色的完整示例代码:

    使用系统诊断;
    命名空间BitMiracle.Docotic.Pdf.Samples
    {
    公共静态类CopyPageObjects
    {
    公共静态void Main()
    {
    //注:
    //在试用模式下使用时,库会施加一些限制。
    //请访问http://bitmiracle.com/pdf-library/trial-restrictions.aspx
    //了解更多信息。
    常量字符串PathToFile=“CopyPageObjects.pdf”;
    使用(var pdf=new PdfDocument(@“your_document.pdf”))
    {
    使用(PdfDocument copy=pdf.CopyPages(0,1))
    {
    PdfPage sourcePage=copy.Pages[0];
    PdfPage copyPage=copy.AddPage();
    copyPage.Rotation=sourcePage.Rotation;
    copyPage.MediaBox=sourcePage.MediaBox;
    if(sourcePage.CropBox!=sourcePage.MediaBox)
    copyPage.CropBox=sourcePage.CropBox;
    PdfCanvas target=copyPage.Canvas;
    foreach(sourcePage.GetObjects()中的PdfPageObject obj)
    {
    target.SaveState();
    setClipRegion(目标,对象ClipRegion);
    if(obj.Type==PdfPageObjectType.Path)
    {
    PdfPath path=(PdfPath)obj;
    目标转换(路径转换矩阵);
    if(path.PaintMode==PdfDrawMode.Fill | | path.PaintMode==PdfDrawMode.FillAndStroke)
    挫折(target.Brush,path.Brush);
    if(path.PaintMode==PdfDrawMode.Stroke | | path.PaintMode==PdfDrawMode.FillAndStroke)
    setPen(target.Pen,path.Pen);
    追加路径(目标,路径);
    绘制路径(目标、路径);
    }
    else if(obj.Type==PdfPageObjectType.Image)
    {
    PDFPaintedImageImage=(PDFPaintedImageOBJ);
    target.TranslateTransform(image.Position.X,image.Position.Y);
    目标.变换(图像.变换矩阵);
    挫折(target.Brush,image.Brush);
    target.DrawImage(image.image,0,0,0);
    }
    else if(obj.Type==PdfPageObjectType.Text)
    {
    PdfTextData text=(PdfTextData)obj;
    drawText(目标,文本);
    }
    target.RestoreState();
    }
    复制。删除页面(0);
    复制.保存(路径文件);
    }
    }
    进程启动(PathToFile);
    }
    私有静态void setClipRegion(PdfCanvas画布、PdfClipRegion clipRegion)
    {
    if(clipRegion.IntersectedPaths.Count==0