当前位置: 首页 > news >正文

PDFsharp使用介绍

0、说明

  项目组开发的应用系统已经使用了多年,我在其中负责使用C#的GDI+功能绘制特定的卡片格式并支持在线编辑。用户在使用过程中提出,他们希望将应用系统中使用GDI+绘制的卡片格式和内容变成pdf文档,然后在应用系统外使用。之前采用的是偷懒的方式,因为用户电脑上都装了pdf打印机,所以建议他们直接在应用系统中将卡片打印到pdf打印机上,这样就生成了pdf格式的文档。但是他们有批量输出卡片的需求,还想按一定的顺序把多个卡片的内容合并到一个pdf文档中,这时用pdf打印机生成pdf文档就满足不了需求了。
  通过在网上搜索,最终确定
开源C#类库PDFsharp能够满足要求。(对比iTextSharp,在画相关元素时,会慢不少,20页A4内容,OpenXML和iTextSharp都能保持在2S内输出完成,而PDFSharp需要5-10S

1、PDFsharp介绍

  PDFsharp是个.net类库,用于在C#、VB.NET等.net编程语言中以编程方式操作Adobe PDF文档。PDFsharp为PDF文档中的每种对象都创建了类,因此在程序中不需要直接操作对象ID或者引用。
  PDFsharp的特点有:

  • 使用任意.net 编程语言实时创建pdf文档
  • 可以从不同数据源中导入数据,例如XML文件或其它数据接口(任意可在.net中使用的数据源);
  • 在pdf页面中使用的绘图代码同样适用于窗口或打印机;
  • 能够编辑、合并、拆分现有pdf文档
  • 具有透明度的图像(彩色掩模、单色掩模、α掩模);
  • 使用C#语言重写PDFsharp代码;
  • PDFsharp中的图形类与.net很匹配。

2、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类中提供下列函数绘制直线和曲线:

  • DrawLine
  • DrawLines
  • DrawBezier
  • DrawBeziers
  • DrawCurve
  • DrawArc

       上述函数都需要使用XPen参数来设置如何绘制直线或曲线。

绘制形状

  XGraphics类中提供下列函数绘制预先定义好的形状:

  • DrawRectangle
  • DrawRectangles
  • DrawRoundedRectangle
  • DrawEllipse
  • DrawPolygon
  • DrawPie
  • DrawClosedCurve

       上述函数都需要使用XPen参数或XBrush参数来绘制或者填充形状。

绘图路径

  XGraphicalPath类表示一个绘图路径,类似于System.Drawing中的GraphicalPath类。XGraphics类中提供下列函数绘制绘图路径:

  • DrawPath

       上述函数都需要使用XPen参数或XBrush参数来绘制或者填充路径。

字体

  当前版本的PDFsharp支持TrueType字体和OpenType字体,也即支持Microsoft Windows中的常见字体。使用XFont类创建字体对象:

XFont font = new XFont("Verdana", 12, XFontStyle.Italic)

  使用XPdfFontOptions进行PDF的字体设置:

  • 采用 ANSI 或Unicode编码;
  • 在PDF文档中嵌入字体或其子集。

文本

  XGraphics类中提供下列文本处理函数:

  • MeasureString
  • DrawString

      DrawString函数使用XStringFormat参数设置文本对齐方式。

图形

  XGraphics类中提供下列函数绘制图形:

  • DrawImage

  PDFsharp支持下列图形格式:

  • BMP
  • GIF
  • PNG
  • JPEG
  • TIFF

绘图状态

  XGraphics类中提供下列函数保存和还原当前绘图状态:

  • Save
  • Restore
  • BeginContainer
  • EndContainer

  在做图形变换或区域剪切之前使用上述函数保存绘图状态,并在处理完成后还原到图形变换或区域剪切之前的绘图状态。

坐标系变换

  XGraphics类中提供下列函数进行坐标系变换:

  • TranslateTransform
  • ScaleTransform
  • RotateTransform
  • MultiplyTransform
  • AddTransform

  将函数参数与XMatrix相乘,函数会立即作用到当前绘图上下文中。使用XMatrixOrder对象指定变换放在当前变换之前还是之后。使用Save及Restore函数保存当前绘图状态。

剪切

  XGraphics类中提供下列函数控制剪切区域:

  • IntersectClip

  剪切区域之外的文本和图形不可见。使用Save及Restore函数保存当前绘图状态。

其它函数

  XGraphics类中还提供下列函数:

  • WriteComment
  • Internals

  第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

相关文章:

  • 详解开源免费且稳定实用的.NET PDF打印组件itextSharp
  • 机器人是什么
  • C++中L和_T()之区别
  • 关于 wcout 输出中文的问题
  • 非静态成员必须与特定对象相对
  • 压缩文件修复
  • 循环冗余校验(CRC)算法入门引导
  • C++ getline函数用法详解
  • cout后面输出时加endl和不加endl的区别
  • iostream
  • ChromeNativeMessaging 原生消息通信
  • IT前端开发和后端开发
  • socket原理及实例
  • 关于iostream与using namespace std 的解析
  • ws2_32.dll和wsock32.dll
  • 【译】JS基础算法脚本:字符串结尾
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • angular2开源库收集
  • ESLint简单操作
  • Github访问慢解决办法
  • Git初体验
  • Java 最常见的 200+ 面试题:面试必备
  • pdf文件如何在线转换为jpg图片
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Spring Cloud Alibaba迁移指南(一):一行代码从 Hystrix 迁移到 Sentinel
  • supervisor 永不挂掉的进程 安装以及使用
  • Theano - 导数
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 对象引论
  • 爬虫模拟登陆 SegmentFault
  • 前端js -- this指向总结。
  • 入门到放弃node系列之Hello Word篇
  • 深入浏览器事件循环的本质
  • 实战:基于Spring Boot快速开发RESTful风格API接口
  • 使用权重正则化较少模型过拟合
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 字符串匹配基础上
  • 【干货分享】dos命令大全
  • 大数据全解:定义、价值及挑战
  • ​secrets --- 生成管理密码的安全随机数​
  • (LeetCode C++)盛最多水的容器
  • (Matlab)使用竞争神经网络实现数据聚类
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (一)appium-desktop定位元素原理
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • 、写入Shellcode到注册表上线
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET连接MongoDB数据库实例教程
  • /var/lib/dpkg/lock 锁定问题
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @private @protected @public
  • [23] GaussianAvatars: Photorealistic Head Avatars with Rigged 3D Gaussians