You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求基于iTextSharp C#按颜色分离PDF对象并转CMYK黑的伪代码

C# 实现PDF对象按颜色分离并转为CMYK黑色的伪代码

我们可以使用iText7库来处理PDF内容的颜色识别、对象分离和颜色转换,以下是核心逻辑的伪代码实现:

核心步骤说明

  • 加载源PDF,遍历每一页的内容元素
  • 按元素的原始颜色对内容进行分组
  • 对每个颜色组,复制所有元素并将其颜色替换为CMYK纯黑(C=0, M=0, Y=0, K=100)
  • 将处理后的各组元素添加到输出PDF中(每个颜色组对应一份黑色副本内容)

伪代码实现

using iText.Kernel.Pdf;
using iText.Kernel.Pdf.Canvas.Parser;
using iText.Kernel.Pdf.Canvas.Parser.Data;
using iText.Kernel.Colors;
using System.Collections.Generic;

// 存储颜色与对应元素的分组字典
Dictionary<Color, List<CanvasElement>> colorGroupedElements = new Dictionary<Color, List<CanvasElement>>();

// 1. 加载源PDF与创建输出PDF
PdfDocument sourceDoc = new PdfDocument(new PdfReader("本地源文件路径"));
PdfDocument outputDoc = new PdfDocument(new PdfWriter("本地输出文件路径"));

// 遍历源文档每一页
for (int pageNum = 1; pageNum <= sourceDoc.GetNumberOfPages(); pageNum++)
{
    PdfPage sourcePage = sourceDoc.GetPage(pageNum);
    PdfPage outputPage = outputDoc.AddNewPage(sourcePage.GetPageSize());
    
    // 自定义处理器提取页面元素及颜色
    var elementExtractor = new CustomElementExtractor();
    elementExtractor.ProcessPageContent(sourcePage);
    
    // 将提取的元素按原始颜色分组
    foreach (var element in elementExtractor.ExtractedElements)
    {
        if (!colorGroupedElements.ContainsKey(element.OriginalColor))
        {
            colorGroupedElements[element.OriginalColor] = new List<CanvasElement>();
        }
        colorGroupedElements[element.OriginalColor].Add(element);
    }
    
    // 2. 处理每个颜色组,转为CMYK黑色并绘制到输出页
    Color cmykBlack = new CmykColor(0f, 0f, 0f, 1f);
    PdfCanvas outputCanvas = new PdfCanvas(outputPage);
    
    foreach (var colorGroup in colorGroupedElements)
    {
        foreach (var element in colorGroup.Value)
        {
            // 克隆元素并替换颜色为CMYK黑
            CanvasElement clonedElement = element.Clone();
            clonedElement.TargetColor = cmykBlack;
            
            // 将处理后的元素绘制到输出画布
            clonedElement.DrawToCanvas(outputCanvas);
        }
    }
}

// 关闭文档释放资源
sourceDoc.Close();
outputDoc.Close();

// 自定义元素提取处理器
public class CustomElementExtractor : PdfCanvasProcessor
{
    public List<CanvasElement> ExtractedElements { get; set; } = new List<CanvasElement>();
    
    protected override void InvokeOperator(PdfLiteral oper, List<PdfObject> operands)
    {
        base.InvokeOperator(oper, operands);
        string operatorName = oper.ToString();
        
        // 拦截文本、线条、填充路径等核心绘制操作
        if (new[] { "Tj", "TJ", "S", "f", "f*" }.Contains(operatorName))
        {
            Color currentColor = GetCurrentDrawingColor();
            ExtractedElements.Add(new CanvasElement
            {
                Type = GetElementType(operatorName),
                OriginalColor = currentColor,
                Operands = new List<PdfObject>(operands)
            });
        }
    }
    
    // 获取当前上下文的绘制颜色,兼容多颜色空间
    private Color GetCurrentDrawingColor()
    {
        var colorSpace = GetCurrentContext().GetFillColorSpace();
        float[] colorValues = GetCurrentContext().GetFillColor();
        
        return colorSpace switch
        {
            DeviceRgb _ => new RgbColor(colorValues[0], colorValues[1], colorValues[2]),
            DeviceCmyk _ => new CmykColor(colorValues[0], colorValues[1], colorValues[2], colorValues[3]),
            DeviceGray _ => new GrayColor(colorValues[0]),
            _ => new RgbColor(colorValues[0], colorValues[1], colorValues[2]) // 兼容其他颜色空间的 fallback
        };
    }
    
    private ElementType GetElementType(string operatorName)
    {
        return operatorName switch
        {
            "Tj" or "TJ" => ElementType.Text,
            "S" or "s" => ElementType.Line,
            "f" or "f*" => ElementType.FilledPath,
            _ => ElementType.Other
        };
    }
}

// 存储PDF元素信息的实体类
public class CanvasElement
{
    public ElementType Type { get; set; }
    public Color OriginalColor { get; set; }
    public Color TargetColor { get; set; }
    public List<PdfObject> Operands { get; set; }
    
    // 克隆元素方法
    public CanvasElement Clone()
    {
        return new CanvasElement
        {
            Type = this.Type,
            OriginalColor = this.OriginalColor,
            TargetColor = this.TargetColor,
            Operands = new List<PdfObject>(this.Operands)
        };
    }
    
    // 将元素绘制到指定画布
    public void DrawToCanvas(PdfCanvas canvas)
    {
        switch (Type)
        {
            case ElementType.Text:
                canvas.SetFillColor(TargetColor);
                canvas.ShowText((PdfString)Operands[0]);
                break;
            case ElementType.Line:
                canvas.SetStrokeColor(TargetColor);
                canvas.Stroke();
                break;
            case ElementType.FilledPath:
                canvas.SetFillColor(TargetColor);
                canvas.Fill();
                break;
            default:
                // 处理其他类型元素
                break;
        }
    }
}

public enum ElementType
{
    Text,
    Line,
    FilledPath,
    Other
}

关键说明

  1. 颜色兼容处理:代码会自动识别PDF中的RGB、CMYK、灰度等颜色空间,统一转换为可操作的Color对象后替换为CMYK纯黑。
  2. 元素精准提取:通过拦截PDF底层绘制操作符,精准抓取文本、线条、填充路径等核心元素及其颜色信息。
  3. 副本生成逻辑:每个颜色组的元素都会被克隆并转为黑色,确保所有原始颜色的对象都对应生成一份黑色副本。

内容的提问来源于stack exchange,提问作者NewBee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 13:53:22