首页 > 解决方案 > 提取pdf矢量对象

问题描述

有没有办法用 C# 提取具有特定颜色的矢量对象的坐标和尺寸?例如,像“切线”或“切割线”?我尝试使用 PDFSharp 库,但它似乎没有这样的功能。我可以使用相应的颜色提取样本,但不能提取对象的坐标或尺寸。

标签: c#pdfpdfsharp

解决方案


您可以使用PDF4NET从 PDF 页面列出矢量图形,如下所示(假设您的切线和切割线是分离色):

PDFFixedDocument document = new PDFFixedDocument(pdfFile);

PDFContentExtractor ce = new PDFContentExtractor(document.Pages[pageNumber]);
PDFVisualObjectCollection pageVisualObjects = ce.ExtractVisualObjects(false);

for (int i = 0; i < pageVisualObjects.Count; i++)
{
    switch (pageVisualObjects[i].Type)
    {
        case PDFVisualObjectType.Path:
            PDFPathVisualObject pathVisualObject = pageVisualObjects[i] as PDFPathVisualObject;
            if ((pathVisualObject.Pen != null) && 
                (pathVisualObject.Pen.Color.ColorSpace.Type == PDFColorSpaceType.Separation))
            {
                PDFSeparationColorSpace cs = 
                    pathVisualObject.Pen.Color.ColorSpace as PDFSeparationColorSpace;
                if (cs.Colorant == "dieline")
                {
                    Console.WriteLine("dieline stroke");
                    for (int j = 0; j < pathVisualObject.PathItems.Count; j++)
                    {
                        Console.Write("{0}: ", pathVisualObject.PathItems[j].Type);
                        if (pathVisualObject.PathItems[j].Points != null)
                        {
                            for (int k = 0; k < pathVisualObject.PathItems[j].Points.Length; k++)
                            {
                                Console.Write("[{0:0.######}, {1:0.######}] ", 
                                    pathVisualObject.PathItems[j].Points[k].X, 
                                    pathVisualObject.PathItems[j].Points[k].Y);
                            }
                        }
                        Console.WriteLine("");
                    }
                }
            }
            if ((pathVisualObject.Brush != null) &&
                (pathVisualObject.Brush.Color.ColorSpace.Type == PDFColorSpaceType.Separation))
            {
                PDFSeparationColorSpace cs =
                    pathVisualObject.Brush.Color.ColorSpace as PDFSeparationColorSpace;
                if (cs.Colorant == "dieline")
                {
                    Console.WriteLine("dieline fill");
                    for (int j = 0; j < pathVisualObject.PathItems.Count; j++)
                    {
                        Console.Write("{0}: ", pathVisualObject.PathItems[j].Type);
                        if (pathVisualObject.PathItems[j].Points != null)
                        {
                            for (int k = 0; k < pathVisualObject.PathItems[j].Points.Length; k++)
                            {
                                Console.Write("[{0:0.######}, {1:0.######}] ",
                                    pathVisualObject.PathItems[j].Points[k].X,
                                    pathVisualObject.PathItems[j].Points[k].Y);
                            }
                        }
                        Console.WriteLine("");
                    }
                }
            }
            break;
    }
}

这是包含填充和描边矩形的示例 PDF 文件的输出:

dieline stroke
MoveTo: [20, 605]
LineTo: [270, 605]
LineTo: [270, 705]
LineTo: [20, 705]
CloseSubpath:
dieline fill
MoveTo: [20, 605]
LineTo: [270, 605]
LineTo: [270, 705]
LineTo: [20, 705]
CloseSubpath:

免责声明:我为开发 PDF4NET 库的公司工作。


推荐阅读