最近需要做一个PDF自动审核盖章的工作,其实就是读取PDF,然后再最后一页加入一个审核章印图片上去。看起来很简单,不过在开发过程中,还是遇到了一些问题,在这里记录一下。

  

  

主要遇到的问题是页面的旋转 和 内容的旋转 的分开的,需要分别操作。

  准备工作需要下载 iTextSharp.dll 然后加入引用

  

  

  

  using iTextSharp.text;
  using iTextSharp.text.pdf;

          string path = @"D:\28727_LOG001_FOLIOLE COMPANY LIMITED_STOCK_PI";
// 创建一个PdfReader对象
PdfReader reader = new PdfReader(path + ".pdf"); // 获得文档页数
int n = reader.NumberOfPages;
// 获得第一页的大小
Rectangle psize = reader.GetPageSize(); float width = psize.Width;
float height = psize.Height; // 创建一个文档变量
Document document = new Document(psize); // 创建该文档 生成物理文件
PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(path + "_APPROVE.pdf", FileMode.OpenOrCreate)); // 打开文档
document.Open(); // 添加内容
PdfContentByte cb = writer.DirectContent; for (int i = ; i < n; )
{ i++;
//设置指定页的PagSize 包含Rotation(页面旋转度)
document.SetPageSize(reader.GetPageSizeWithRotation(i));
//创建一个新的页面,需要注意的调用NewPage() ,PdfContentByte cb 对象会默认清空
document.NewPage(); //获取指定页面的旋转度
int rotation = reader.GetPageRotation(i); //获取加载PDF的指定页内容
PdfImportedPage page1 = writer.GetImportedPage(reader, i); //添加内容页到新的页面,并更加旋转度设置对应的旋转
switch (rotation)
{
case :
cb.AddTemplate(page1, , -, , , , reader.GetPageSizeWithRotation(i).Height);
break;
case :
cb.AddTemplate(page1, -, , , -, reader.GetPageSizeWithRotation(i).Width, reader.GetPageSizeWithRotation(i).Height); break;
case :
cb.AddTemplate(page1, , , -, , reader.GetPageSizeWithRotation(i).Width, );
break;
default:
cb.AddTemplate(page1, , , , , , );//等同于 cb.AddTemplate(page1, 0,0)
break;
} if (i == n)//如果是最后一页加入指定的图片
{
               //不同旋转度的页面 图片位置left距离的调整
                       int imgLeft = ;
               if(rotation==90 || rotation==270)
               { imgLeft = ; } 
//创建一个图片对象
iTextSharp.text.Image img = iTextSharp.text.Image.GetInstance(new Uri(@"d:\Lock-icon.png")); //设置图片的指定大小
//img.ScaleToFit(140F, 320F); //按比例缩放
//img.ScalePercent(50); //把图片增加到内容页的指定位子 b width c height e bottom f left
cb.AddImage(img, , 32F, 32F, , 50F, imgLeft); //开始增加文本
cb.BeginText(); BaseFont bf = BaseFont.CreateFont(BaseFont.HELVETICA_OBLIQUE, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
//设置字体 大小
cb.SetFontAndSize(bf, ); //指定添加文字的绝对位置
cb.SetTextMatrix(imgLeft, );
//增加文本
cb.ShowText("GW INDUSTRIAL LTD"); //结束
cb.EndText(); } }
// 关闭文档 document.Close(); }
catch (Exception de)
{
Console.Error.WriteLine(de.Message);
Console.Error.WriteLine(de.StackTrace);
}

记录工作点滴,持续提升自己。

最新文章

  1. 在CentOS上构建.net自动化编译环境
  2. android基础知识进阶
  3. python之进程与线程
  4. VirtualBox使用总结
  5. Lesson: The &quot;Hello World!&quot; Application
  6. poj2955括号匹配 区间DP
  7. iOS 中通过使用Google API获得Google服务
  8. 3 javascript
  9. Codevs 2898 卢斯的进位制
  10. UVALive 2238 Fixed Partition Memory Management(二分完美匹配)
  11. mysql之数据库备份与恢复
  12. ArrayList、Vector、LinkedList的区别及其优缺点? (转载)
  13. loadrunner_analysis技巧_average 和 90% percent
  14. 关于T-SQL重编译那点事,WITH RECOMPILE和OPTION(RECOMPILE)区别仅仅是存储过程级重编译和SQL语句级重编译吗
  15. MYSQL导入数据报错|MYSQL导入超大文件报错|MYSQL导入大数据库报错:2006 - MySQL server has gone away
  16. [原创]基于Zynq Linux环境搭建(二)
  17. msp430学习笔记-USART
  18. 【Java基础】8、java中的native方法
  19. 浅析Java虚拟机结构与机制[转]
  20. Datagrid分页、排序、删除代码

热门文章

  1. ubuntu下libjson-c库的使用问题备忘
  2. ViewPager 详解(三)---PagerTabStrip与PagerTitleStrip添加标题栏的异同
  3. fork 和 vfork 的区别与联系
  4. Win32 WriteFile and ReadFile
  5. GSON 示例代码 实用版
  6. Html.RenderPartial和Html.RenderAction的区别
  7. python 下的数据结构与算法---7:查找
  8. cocos2dx之触摸事件
  9. maven管理的项目出现Error configuring application listener of class org.springframework.web.context.ContextL
  10. Spring4.0学习笔记(1) —— 基础知识