详解Spire.PDF中的坐标体系及应用
Spire.PDF是一款专业的基于.NET平台的PDF组件。它能够让开发人员在不使用Adobe Acrobat和其他外部控件的情况下,运用.NET 应用程序创建,阅读,编写和操纵PDF 文档。文本将详细为大家介绍Spire.PDF中坐标体系及其应用。
坐标系定义
坐标系是PDF中一项十分重要的体系,PDF的中任何元素,例如文本、图片、表格等,都必须建立在坐标体系上。有了坐标系,我们才能在指定的位置添加(绘制)这些内容。Adobe公司的 PDF文档规范中将坐标系的原点定在了页面的左下角,这样的坐标系其实不方便我们自上而下书写内容。Spire.PDF的坐标系有如下规定:
- 原点位于PDF页面的左上角顶点
- X正半轴是原点开始向右延伸的轴,Y正半轴是原点开始向下延伸的轴
- 以磅作为单位,如果PDF页面大小为A4,那么页面右下角顶点坐标为(595,842)
图1 Spire.PDF中的坐标系
从以上规定中,我们很容易看出,Spire.PDF中的坐标体系很方便程序员自上而下在PDF页面上添加页面元素。除了以上设定以外,Spire.PDF的新建PDF页面内还有边缘(PdfMargins)的设定,边缘是为了方便程序员在除边缘以外的地方添加内容,这跟Word中的边缘设定比较类似。由于边缘的出现,在新建页面中,坐标原点的位置是除边缘以外的区域的左上角顶点。这样的设定,方便程序员在PDF页面上添加内容时不再需要人为地留出空白。
图2 新建PDF页面的坐标体系
上面一直强调新建页面,在现成的PDF页面中是没有边缘的概念的。实际上,Adobe PDF文档规范也没有边缘的概念。对于一个现成的PDF页面,坐标系维持原先的规定不变。现在对新建页面中的坐标体系做出总结:
- 新建页面中,坐标系原点开始于除边缘外的左上角顶点
- 边缘区域内有坐标,但是边缘区域不能显示任何内容
- 如果想在边缘区域绘制内容,在创建页面时必须将边缘设置为0,此时坐标系原点回到页面左上角定点
坐标系转换
在PDF中添加内容时,为了让内容呈现某种的效果,例如将文字和图片旋转一定角度,我们需要借助坐标系转换来是实现这些效果。Spire.PDF中坐标系转换包括下如图3所示的四种方式,它们对应的方法分别是TranslateTrsanform, ScaleTransform, RotateTransform和SkewTransform。下面举例说明它们的用法:
- TranslateTransform(5,5) 表示坐标系向右、向下分别平移5个单位
- ScaleTransform(2,2) 表示X、Y轴上的单位长度放大2倍
- RotateTansform(-45) 表示坐标系逆时针旋转45度
- SkewTransform(10,10) 表示X轴向下倾斜10度,Y轴向右倾斜10度
图3 Spire.PDF中的坐标系转换
坐标系的应用
1. 在指定位置绘制文本、图片等
整个PDF页面实际上一块大的画布,我们需要通过Canvas.DrawString方法和Canvas.DrawImage方法绘制文本和图片,参考代码如下:
//创建PdfDocument对象
PdfDocument doc = new PdfDocument();/*添加页面,指定页面大小和边缘大小* 该方法还有以下重载方法,无参的方法默认含有40磅的边距* Add(); * Add(SizeF size); * Add(SizeF size, PdfMargins margins);* Add(SizeF size, PdfMargins margins, PdfPageRotateAngle rotation);* Add(SizeF size, PdfMargins margins, PdfPageRotateAngle rotation, PdfPageOrientation orientation);*/
doc.Pages.Add(PdfPageSize.A4, new PdfMargins(0));//创建TrueType字体
PdfTrueTypeFont font= new PdfTrueTypeFont(new Font("宋体",10),true);//在PDF页面中的指定位置绘制文字
doc.Pages[0].Canvas.DrawString("你好", font, PdfPens.Black, new PointF(50, 50));//加载图片到PdfImage对象
PdfImage image= PdfImage.FromFile(@"C:\Users\Administrator\Desktop\flag.png");//在PDF页面中的指定位置绘制图片
doc.Pages[0].Canvas.DrawImage(image, 50, 70);//保存文档
doc.SaveToFile("output.pdf");
2. 获取文字、图片坐标
有了坐标体系,我们也可以获取现有PDF文档中文字或图片的位置(X,Y坐标),代码参考如下:
//创建PdfDocument对象
PdfDocument doc = new PdfDocument();//加载一个现有的PDF文档
doc.LoadFromFile(@"C:\Users\Administrator\Desktop\test.pdf");//查找第一页中所有的“Germany”
PdfTextFind[] text = doc.Pages[0].FindText("Germany").Finds;//获取第一个“Germany”出现的位置
PointF p = text[0].Position;
Console.WriteLine("第一个Germany出现的位置:({0},{1})", p.X, p.Y);//获取第一页中所有的图片信息
PdfImageInfo[] imageInfo = doc.Pages[0].ImagesInfo;//获取第一张图片的位置信息
RectangleF rect = imageInfo[0].Bounds;
Console.WriteLine("第一张图片的位置:({0},{1})", rect.X, rect.Y);
Console.ReadLine();
3. 利用坐标系转换创建居中呈45度的文字效果
这里我们将借助坐标的转换方法,在一个文档正中间添加一行斜向上的文字,形成一种“水印文字”的感觉。代码中涉及到了一些坐标平移的位置计算,这里不做太详细的介绍。
//创建PdfDocument对象
PdfDocument pdf = new PdfDocument();//加载现有PDF文档
pdf.LoadFromFile(@"F:\Documents\PDF\系统测试.pdf");//创建字体
PdfTrueTypeFont font = new PdfTrueTypeFont(new Font("宋体", 40f), true);//要写的文字
string text = "版权所有,侵权必究";//测量文字所占的位置大小,即高宽
SizeF fontSize = font.MeasureString(text);//计算两个偏移量
float offset1 = (float)(fontSize.Width * System.Math.Sqrt(2) / 4);
float offset2 = (float)(fontSize.Height * System.Math.Sqrt(2) / 4);//遍历文档每一页
foreach (PdfPageBase page in pdf.Pages)
{//设置页面透明度page.Canvas.SetTransparency(0.8f);//将页面中坐标系向右下平移page.Canvas.TranslateTransform(page.Canvas.Size.Width / 2 - offset1 - offset2, page.Canvas.Size.Height / 2 + offset1 - offset2);//将坐标系逆时针旋转45度page.Canvas.RotateTransform(-45);//在页面上绘制文本page.Canvas.DrawString(text, font, PdfBrushes.DarkGray, 0, 0);
}//保存文档
pdf.SaveToFile("output.pdf");
效果:
图4 在PDF文档添加倾斜45度并居中的文字
详解Spire.PDF中的坐标体系及应用相关推荐
- 【NLP】四万字全面详解 | 深度学习中的注意力机制(四,完结篇)
作者 | 蘑菇先生 知乎 | 蘑菇先生学习记 深度学习Attention小综述系列: 四万字全面详解 | 深度学习中的注意力机制(一) 四万字全面详解 | 深度学习中的注意力机制(二) 四万字全面详解 ...
- 【NLP】四万字全面详解 | 深度学习中的注意力机制(三)
NewBeeNLP原创出品 公众号专栏作者@蘑菇先生 知乎 | 蘑菇先生学习记 深度学习Attenion小综述系列: 四万字全面详解 | 深度学习中的注意力机制(一) 四万字全面详解 | 深度学习中的 ...
- 【NLP】四万字全面详解 | 深度学习中的注意力机制(二)
NewBeeNLP原创出品 公众号专栏作者@蘑菇先生 知乎 | 蘑菇先生学习记 前情提要:四万字全面详解 | 深度学习中的注意力机制(一) 目前深度学习中热点之一就是注意力机制(Attention ...
- 详解OpenCV的椭圆曲线点坐标近似计算函数ellipse2Poly()
详解OpenCV的椭圆曲线点坐标近似计算函数ellipse2Poly() 函数ellipse2Poly()可用于近似计算椭圆曲线的像素坐标. 而前面介绍过的函数ellipse()则是直接在图像中绘制椭 ...
- 【详解】SPI中的极性CPOL和相位CPHA是什么以及如何设置
[详解]SPI中的极性CPOL和相位CPHA是什么以及如何设置 2012-03-0214:34:10| 分类:单片机 | 标签: |字号大中小 订阅 版本:2011-08-15 作者:crif ...
- android webview epub,《webview实现epub阅读器详解》.pdf
<webview实现epub阅读器详解>.pdf webview实现epub阅读器详解 主讲:eoe移动开发者社区 移动老师 课程地址:/course/座机电话号码72 简易epub阅读器 ...
- float属性html,详解CSS样式中的float属性
详解CSS样式中的float属性.float是 css 样式的定位属性.我们在印刷排版中,文本可以按照需要围绕图片.一般把这种方式称为"文本环绕".在网页设计中,应用了CSS的fl ...
- java调用项目中的文件_详解eclipse项目中.classpath文件的使用
1 前言 在使用eclipse或者myeclipse进行java项目开发的时候,每个project(工程)下面都会有一个.classpath文件,那么这个文件究竟有什么作用? 2 作用 .classp ...
- Session机制详解及分布式中Session共享解决方案
Session机制详解及分布式中Session共享解决方案 参考文章: (1)Session机制详解及分布式中Session共享解决方案 (2)https://www.cnblogs.com/jing ...
最新文章
- Table doesn't have a primary key
- 不再为Apache进程淤积、耗尽内存而困扰[转载]
- c++如何获取文件时间_Linux下如何删除长时间不使用的旧文件?
- springboot中使用mybatis
- 织梦DedeCMS播放本地视频文件插件
- pandas如何保存在excel里面_【精选】Pandas一站式教程!
- struts2在lt;s:selectgt;用动态标签
- Android用户界面开发:控件集合
- javascript滚动栏响应鼠标滑轮的实现上下滚动事件
- Mac OS 电信3G上网设置
- MongoDB分片集群部署(三)
- SAP ABAP EXCEL导出多个SHEET页签
- Scalable Object Detection using Deep Neural Networks 阅读笔记
- 简单介绍下C/S与B/S架构的异同
- Java GUI(快递信息管理系统)
- 【最新版】一款容易吸粉的盲盒抽奖小程序源码
- Hadoop学习1--解决启动过程中的问题
- SIM卡ICCID的含义
- 一文“六问”带你吃透kubernetes架构原理
- WordPress建站详细流程,WordPress入门
热门文章
- SaaS-HRM--第3章-SaaS系统用户权限设计
- HOOK显卡驱动达到D3D游戏,c++实现人物透视完美源代码!
- JS中定时器和延时调用学习笔记
- excel爬虫相关学习1:简单的excel爬虫
- PROE基本操作1(查看组件尺寸)
- 马里奥制造,Ready~~GO!「GitHub 热点速览 v.22.16」
- VASP输入INCAR文件
- java中的vm自变量_java中JVM虚拟机内存模型详细说明
- springboot 上传文件报错:java.io.IOException: The temporary upload location [/tmp/tomcat.xxx] is not valid
- Linux系统防CC攻击自动拉黑IP增强版(Shell脚本)