如何使用PDF4NET将PDFPathVisualObject转换为WPF的System.Windows.Shapes.Path
解决PDF4NET的PDFPathVisualObject转WPF Path的问题
你遇到的路径信息不一致问题,核心是PDF和WPF的坐标系统、单位规则不匹配:PDF以页面左下角为原点,单位是点(1点=1/72英寸);WPF以左上角为原点,单位是设备无关单位(1单位=1/96英寸)。直接转换肯定会错位,下面是完整的转换逻辑:
1. 先处理坐标与单位转换
先获取PDF页面尺寸,再把PDF坐标转换成WPF兼容的坐标:
// 获取PDF页面尺寸(单位:点) PDFPage page = document.Pages[0]; double pdfPageWidth = page.Width; double pdfPageHeight = page.Height; // 单位转换系数:PDF点 → WPF单位 double unitScale = 96.0 / 72.0; // 转换PDF坐标到WPF坐标的工具方法 Point ConvertPdfToWpfPoint(PDFPoint pdfPoint) { // 翻转Y轴(PDF左下原点→WPF左上原点),同时做单位缩放 double wpfX = pdfPoint.X * unitScale; double wpfY = (pdfPageHeight - pdfPoint.Y) * unitScale; return new Point(wpfX, wpfY); }
2. 遍历PathItems生成WPF Path的Geometry
把PDFPathVisualObject里的每个路径项,转换成对应的WPF路径段:
if (pvo != null) { PathFigure pathFigure = new PathFigure(); PathGeometry pathGeometry = new PathGeometry(); pathGeometry.Figures.Add(pathFigure); foreach (PDFPathItem item in pvo.PathItems) { switch (item.ItemType) { case PDFPathItemType.MoveTo: PDFMoveToPathItem moveItem = (PDFMoveToPathItem)item; pathFigure.StartPoint = ConvertPdfToWpfPoint(moveItem.Point); break; case PDFPathItemType.LineTo: PDFLineToPathItem lineItem = (PDFLineToPathItem)item; pathFigure.Segments.Add(new LineToSegment(ConvertPdfToWpfPoint(lineItem.Point), true)); break; case PDFPathItemType.CurveTo: PDFCurveToPathItem curveItem = (PDFCurveToPathItem)item; // PDF的三次贝塞尔含3个控制点,对应WPF BezierSegment的三个Point参数 pathFigure.Segments.Add(new BezierSegment( ConvertPdfToWpfPoint(curveItem.Point1), ConvertPdfToWpfPoint(curveItem.Point2), ConvertPdfToWpfPoint(curveItem.Point3), true)); break; case PDFPathItemType.ClosePath: pathFigure.IsClosed = true; break; } } // 生成最终的WPF Path控件 System.Windows.Shapes.Path wpfPath = new System.Windows.Shapes.Path(); wpfPath.Data = pathGeometry; // 可根据PDF原路径样式调整,比如提取PDFPen/PDFFill的颜色、线宽等 wpfPath.Stroke = new SolidColorBrush(Colors.Black); wpfPath.StrokeThickness = 1; }
补充:样式匹配(可选)
如果需要和PDF里的路径样式完全一致,还可以把PDF的Stroke和Fill属性转换成WPF的Brush:
- 从
PDFPen提取颜色、线宽、虚线样式,对应设置WPF Path的Stroke、StrokeThickness、StrokeDashArray - 从
PDFFill提取填充颜色,对应设置WPF Path的Fill
这样转换后的路径就能和PDF中的实际路径完全匹配了。
内容的提问来源于stack exchange,提问作者howze
相关产品推荐
相关产品推荐

