项目组开发的应用系统已经使用了多年,我在其中负责使用C#的GDI+功能绘制特定的卡片格式并支持在线编辑。用户在使用过程中提出,他们希望将应用系统中使用GDI+绘制的卡片格式和内容变成pdf文档,然后在应用系统外使用。之前采用的是偷懒的方式,因为用户电脑上都装了pdf打印机,所以建议他们直接在应用系统中将卡片打印到pdf打印机上,这样就生成了pdf格式的文档。但是他们有批量输出卡片的需求,还想按一定的顺序把多个卡片的内容合并到一个pdf文档中,这时用pdf打印机生成pdf文档就满足不了需求了。
通过在网上搜索,最终确定开源C#类库PDFsharp能够满足要求。
PDFsharp是个.net类库,用于在C#、VB.NET等.net编程语言中以编程方式操作Adobe PDF文档。PDFsharp为PDF文档中的每种对象都创建了类,因此在程序中不需要直接操作对象ID或者引用。
PDFsharp的特点有:
PDFsharp中的绘图相关类与.net框架中System.Drawing命名空间下的GDI+绘图类类似。PDFsharp中的绘图类包括XColor、XPen、XBrush、XGraphics、XRect、XMatrix、XImage等,这样命名的目的是为了仿效GDI+中的类名,之所以所有的类名前都加上X的前缀,是在同一份代码中出现GDI+或WPF绘图类时保持类名不重复。
PDFsharp中的XGraphics类表示抽象的绘图表面,使用下列代码就可以在PDF文件页面上绘图:
XGraphics gfx = XGraphics.FromPdfPage(page);
如果PDF文档中已经有内容,可以使用XGraphicsPdfPageOptions 参数设置新绘制的内容在已有内容之上还是之下。
在GDI版本的PDFsharp中使用XGraphics对象还可以在System.Drawing.Graphics对象上绘图:
XGraphics gfx = XGraphics.FromGraphics(graphics, size);
在WPF版本的PDFsharp中使用XGraphics对象可以在System.Windows.Media.DrawingContext 对象上绘图:
XGraphics gfx = XGraphics.FromDrawingContext(drawingContext, size);
完全有可能使用相同的函数在窗口、打印机或PDF页面上绘图。
当前版本的PDFsharp只有一种图形上下文布局,坐标原点在左上角,坐标轴方向类似于下图所示。默认的计量单位是点(1/72英寸)。这样其实限制不大,因为可以使用变换矩阵来进行平移或者缩放,也可以使用XUnit在点、 英寸、厘米和毫米之间切换。
XGraphics类中提供下列函数绘制直线和曲线:
XGraphics类中提供下列函数绘制预先定义好的形状:
XGraphicalPath类表示一个绘图路径,类似于System.Drawing中的GraphicalPath类。XGraphics类中提供下列函数绘制绘图路径:
当前版本的PDFsharp支持TrueType字体和OpenType字体,也即支持Microsoft Windows中的常见字体。使用XFont类创建字体对象:
XFont font = new XFont("Verdana", 12, XFontStyle.Italic)
使用XPdfFontOptions进行PDF的字体设置:
XGraphics类中提供下列文本处理函数:
DrawString
DrawString函数使用XStringFormat参数设置文本对齐方式。
XGraphics类中提供下列函数绘制图形:
PDFsharp支持下列图形格式:
XGraphics类中提供下列函数保存和还原当前绘图状态:
在做图形变换或区域剪切之前使用上述函数保存绘图状态,并在处理完成后还原到图形变换或区域剪切之前的绘图状态。
XGraphics类中提供下列函数进行坐标系变换:
将函数参数与XMatrix相乘,函数会立即作用到当前绘图上下文中。使用XMatrixOrder对象指定变换放在当前变换之前还是之后。使用Save及Restore函数保存当前绘图状态。
XGraphics类中提供下列函数控制剪切区域:
剪切区域之外的文本和图形不可见。使用Save及Restore函数保存当前绘图状态。
XGraphics类中还提供下列函数:
第1、2章中的内容是从参考文献中摘要并翻译的,如果翻译有误,请参考参考文献中的内容。对这些函数的具体参数及用法,也可以参考参考文献。
参考文献:
[1]https://sourceforge.net/p/pdfsharp/wiki/Home/
[2]http://www.pdfsharp.net/wiki/PDFsharpArticles.ashx
[3]http://www.pdfsharp.net/wiki/PDFsharpFirstSteps.ashx
[4]http://www.pdfsharp.net/Features.ashx
[5]http://www.pdfsharp.net/PDFsharpFeatures.ashx
[6]http://www.pdfsharp.net/wiki/Graphics.ashx