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

如何获取PDF中的专色名称?C#及GhostScript实现方案咨询

获取PDF专色名称及分色处理(C#环境)

一、GhostScript实现方案

可以通过GhostScript结合C#调用实现专色提取和分色需求,具体思路如下:

1. 提取专色名称

GhostScript可将PDF转换为PostScript格式,专色在PostScript中会以/Separation或/DeviceN标记定义。你可以通过C#调用GhostScript命令行生成PS文件,再解析文件提取专色名称:

示例代码

using System.Diagnostics;
using System.IO;
using System.Text.RegularExpressions;

// 调用GhostScript生成PostScript文件
var gsPath = @"C:\Program Files\gs\gs10.02.1\bin\gswin64c.exe"; // 替换为你的GhostScript路径
var inputPdf = "input.pdf";
var outputPs = "temp.ps";

var processStartInfo = new ProcessStartInfo(gsPath)
{
    Arguments = $"-dNOPAUSE -dBATCH -sDEVICE=ps2write -sOutputFile={outputPs} {inputPdf}",
    UseShellExecute = false,
    RedirectStandardOutput = true,
    CreateNoWindow = true
};

using (var process = Process.Start(processStartInfo))
{
    process.WaitForExit();
}

// 解析PS文件提取专色名称
var psContent = File.ReadAllText(outputPs);
var regex = new Regex(@"/(\w+) /Separation");
var matches = regex.Matches(psContent);

foreach (Match match in matches)
{
    Console.WriteLine($"专色名称:{match.Groups[1].Value}");
}

// 清理临时文件
File.Delete(outputPs);

2. 分色输出

GhostScript的separation设备可直接生成单通道的分色文件,命令行参数示例:

gswin64c.exe -dNOPAUSE -dBATCH -sDEVICE=separation -sOutputFile=color_%d.tif -dSeparationColorNames="MySpotColor,Cyan,Magenta,Yellow,Black" input.pdf

同样可以通过C#的Process类调用该命令实现批量分色。

二、iTextSharp/iText 7优化方案

你之前尝试的iTextSharp其实可以直接遍历PDF资源字典提取专色,可能是没找对处理逻辑,以下是可行的实现:

1. iTextSharp 示例

using iTextSharp.text.pdf;
using System;

var reader = new PdfReader("input.pdf");
for (int pageNum = 1; pageNum <= reader.NumberOfPages; pageNum++)
{
    var pageDict = reader.GetPageN(pageNum);
    var resources = pageDict.GetAsDict(PdfName.RESOURCES);
    
    if (resources == null) continue;
    
    var colorSpaceDict = resources.GetAsDict(PdfName.COLORSPACE);
    if (colorSpaceDict == null) continue;
    
    foreach (PdfName key in colorSpaceDict.Keys)
    {
        var obj = colorSpaceDict.Get(key);
        if (obj is PdfArray csArray && csArray.Size > 0)
        {
            var csType = csArray.GetAsName(0);
            if (csType.Equals(PdfName.SEPARATION))
            {
                var spotName = csArray.GetAsName(1).ToString().TrimStart('/');
                Console.WriteLine($"页面{pageNum} 专色名称:{spotName}");
            }
        }
    }
}
reader.Close();

2. iText 7 示例(推荐,iTextSharp已停止维护)

using iText.Kernel.Pdf;
using System;

var pdfDoc = new PdfDocument(new PdfReader("input.pdf"));
for (int pageNum = 1; pageNum <= pdfDoc.GetNumberOfPages(); pageNum++)
{
    var page = pdfDoc.GetPage(pageNum);
    var resources = page.GetResources();
    
    if (resources == null) continue;
    
    var colorSpaceDict = resources.GetAsDictionary(PdfName.ColorSpace);
    if (colorSpaceDict == null) continue;
    
    foreach (var entry in colorSpaceDict.EntrySet())
    {
        var obj = entry.Value;
        if (obj.IsArray())
        {
            var csArray = (PdfArray)obj;
            var csType = csArray.GetAsName(0);
            if (PdfName.Separation.Equals(csType))
            {
                var spotName = csArray.GetAsName(1).GetValue().TrimStart('/');
                Console.WriteLine($"页面{pageNum} 专色名称:{spotName}");
            }
        }
    }
}
pdfDoc.Close();

三、分色处理补充

  • GhostScript适合批量分色输出,无需复杂编码即可生成单通道文件;
  • iText系列则更适合在C#代码中精细化控制分色逻辑,比如只提取指定专色通道并生成新PDF。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 17:30:42