博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
详解Spire.PDF中的坐标体系及应用
阅读量:3578 次
发布时间:2019-05-20

本文共 3617 字,大约阅读时间需要 12 分钟。

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度并居中的文字

你可能感兴趣的文章
半导体激光器—问题整理(二)
查看>>
科研日记7.31
查看>>
zemax仿真二向色镜
查看>>
stm32单片机编程时extern的用法
查看>>
UART4和5的问题
查看>>
Spring框架中在并发访问时的线程安全性
查看>>
网站部署
查看>>
什么情况下会发生栈内存溢出。
查看>>
何为去中心化
查看>>
缓存一致性:写策略
查看>>
Cache一致性:MESI
查看>>
缓存一致性:写未命中
查看>>
为什么用中间位作为组索引
查看>>
缓存:局部性
查看>>
mysql原理:b+树索引
查看>>
mysql原理:最左原则
查看>>
mysql原理:join标到底是什么,为什么有军规不建议超过三个
查看>>
redis缓存穿透
查看>>
redis缓存雪崩
查看>>
mysql的事务隔离
查看>>