声明

本篇文章为学习笔记,有错误或更好的方法请大佬们在评论区踢我下谢谢!

一、 插件准备工作

  1. 使用VS,在.NETFramework框架下创建一个控制台应用程序; 依次点击
  2. 工具->NuGet包管理器->管理解决方案的NuGet程序包; 选择浏览菜单,搜索 iTextSharp,找到后点击安装;
  3. 打开VS项目文件夹,在packages文件夹中
    找到BouncyCastle.1.8.9和iTextSharp.5.5.13.3文件夹依次打开并提取lib文件夹中的dll文件。BouncyCastle.Crypto.dll和itextsharp.dll
  4. 将dll文件放在Unity项目的Plugins文件夹下。
  5. 打开自己的unity编辑器目录“ \Editor\Data\MonoBleedingEdge\lib\mono\unityjit”,将"CodePages.dll"提取到unity项目的Plugins文件下(中文支持)。

二 、创建PDF表单

  1. 新建“FormTest.pdf”文件并打开,点击“表单”》“编辑表单”,设置好字段(WPS PDF不支持表单创建)。

    在unity中创建“StreamingAssets/Document”文件目录,并将“FormTest.pdf”文件导入。

三、读取PDF模板并拷贝

       //模板路径string pdfTemplate =Application.streamingAssetsPath + "/Document/FormTest.pdf";//导出文件路径string outPdf = Application.persistentDataPath + "/Document/Form.pdf";//检查导出导出目录是否存在 不存在则新建if (!Directory.Exists(outPdf)){Directory.CreateDirectory(Application.persistentDataPath + " / Document");}//读取并拷贝模板PdfReader pdfReader = new PdfReader(pdfTemplate);FileStream fileStream = new FileStream(outPdf, FileMode.Create);PdfStamper pdfStamper = new PdfStamper(pdfReader, fileStream);

四、 表单域赋值

4.1 添加中文支持
       //注册CodePagesEncoding.RegisterProvider(CodePagesEncodingProvider.Instance);//创建字体BaseFont font = BaseFont.CreateFont("C:\\WINDOWS\\FONTS\\STSONG.TTF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
4.2 文本域赋值
       pdfStamper.Writer.CloseStream = false;//解除表单锁定pdfStamper.FormFlattening = false;AcroFields fields = pdfStamper.AcroFields;//设置单个域属性(字段名,属性名,属性值)fields.SetFieldProperty("name", "textfont", font, null);fields.SetField("name", "小明");fields.SetFieldProperty("six", "textfont", font, null);fields.SetField("sex", "男");fields.SetField("number", "330521");//设置表单锁定,不设置此的话导出的pdf保留域,可修改,有域高亮但不会打印pdfStamper.FormFlattening = true;pdfStamper.Close();
4.3 图像域赋值

采用的思想是拷贝该图像域,修改好后直接替换。直接修改Image好像不起作用,没试成功!

       pdfStamper.Writer.CloseStream = false;//文本框锁定解除pdfStamper.FormFlattening = false;AcroFields fields = pdfStamper.AcroFields;string TestImage = Application.streamingAssetsPath +"/Textures/TVPS.png";PushbuttonField imgField = fields.GetNewPushbuttonFromField("img");imgField.Layout = PushbuttonField.LAYOUT_ICON_ONLY;imgField.ProportionalIcon = true;imgField.Image = Image.GetInstance(TestImage);fields.ReplacePushbuttonField("img", imgField.Field);pdfStamper.FormFlattening = true;pdfStamper.Close();

五、 打印文件

未验证协程是否有用,文件过大时会出现异常

IEnumerator PrintPDF(string path){//等待文件准备好后开始打印(FillPDFFields())WaitUntil wait = new WaitUntil(()=>FillPDFFields());yield return wait;Process process = new Process(); //系统进程process.StartInfo.CreateNoWindow = true; //不显示调用程序窗口process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; //隐藏打印信息process.StartInfo.UseShellExecute = true; //采用操作系统自动识别模式process.StartInfo.FileName = path; //要打印的文件路径process.StartInfo.Verb = "print"; //指定执行的动作,打印:"print" 打开"open"process.Start(); //开始打印process.Close();}

六、 画图

6.1 绘制曲线

SetColorStroke(strokeColor):画笔颜色
SetLineWidth():画笔粗细
MoveTo(x,y):画笔起点
LineTo(x,y):下一个点的坐标
Stroke():结束路径

//画图
PdfContentByte content = pdfStamper.GetOverContent(1);  //获取上层内容(参数为页码)
BaseColor strokeColor = new BaseColor(0f, 1f, 0f,1f);   //颜色如果为0-1f,f不要忘记
content.SetColorStroke(strokeColor); //设置笔画颜色
content.SetLineWidth(3);
content.MoveTo(0, 0);           //起点
content.LineTo(50, 50);
content.LineTo(300, 100);
content.Stroke();               //结束笔画
6.2 绘制虚线

通过SetLineDash()函数设置虚线,里面的参数还没研究过,如果有大佬知道的麻烦评论区补充下谢谢!

content.SetLineDash(10, 1);
6.3 绘制多边形路径

使用ClosePathStroke()闭合路径并结束画笔,或分布

//content.ClosePathStroke();
content.ClosePath();
content.Stroke();
6.4 绘制多边形并填充颜色

SetColorFill(BaseColor):设置填充颜色
Fill():填充颜色并结束,无描边
FillStroke():填充颜色并结束,非闭合描边
ClosePathFillStroke():填充颜色并结束,闭合描边

content.SetColorFill(strokeColor); //设置填充颜色
content.Fill();
//FillStroke();
//ClosePathFillStroke();

七、文档占用检测

   /// <summary>/// 判断文档是否可以打开/// </summary>/// <param name="path">文档路径</param>/// <returns>结果</returns>private bool CanOpenDocument(String path){try{FileStream fileStream = new FileStream(outPdf, FileMode.Open);}catch(IOException e){Debug.Log("占用中");return false;}return true;}

可以配合协程使用,避免文件过大时,执行打印或其它操作导致的异常失败

WaitUntil wait = new WaitUntil(()=> CanOpenDocument(path));
IEnumerator PrintPDF(string path)
{//填写或操作PDF文件FillPDFFields();  WaitUntil wait = new WaitUntil(()=> CanOpenDocument(path));yield return wait;Debug.Log("成功打开后执行后续操作");
}

参考文献

  1. 插件准备工作:https://blog.csdn.net/weixin_43796392/article/details/124339525
  2. PDF表单创建:https://www.cnblogs.com/loyung/p/6879917.html
  3. 中文字库解决方案:https://blog.csdn.net/qq_36479244/article/details/105638588
  4. 图像域赋值解决方案:https://www.it1352.com/1807525.html
  5. CodePages依赖引入错误解决方案:https://blog.csdn.net/u011588551/article/details/109689452

Unity C# ITextSharp5.5.13 笔记相关推荐

  1. 【unity 保卫星城】--- 开发笔记01(飞机移动)

    [unity 保卫星城]--- 开发笔记 一.在UnityHub中创建2D项目,取名Defend_Star_City 二.导入MangerOfManger框架 三.在打包中,切换安卓开发模式 四.创建 ...

  2. 【unity 保卫星城】--- 开发笔记08(UI轮盘)

    [unity 保卫星城]--- 开发笔记 一.武器轮盘 1.轮盘的旋转 2.选择的武器 3.完成轮盘隐藏和显示 -做完前三个武器,第四个武器准备在前三个武器测试完成没问题后再添加,但再测试前,武器直接 ...

  3. 【unity 保卫星城】--- 开发笔记04(武器管理系统)

    [unity 保卫星城]--- 开发笔记 六.完善类图中的类的功能 3.武器管理的类 4.武器抽象类 六.完善类图中的类的功能 3.武器管理的类 using System.Collections; u ...

  4. 【unity 保卫星城】--- 开发笔记03(飞机类第一版)

    [unity 保卫星城]--- 开发笔记 六.完善类图中的类的功能 2.飞机的类 六.完善类图中的类的功能 2.飞机的类 先放到这后面再慢慢完善~ using System.Collections; ...

  5. 【unity 保卫星城】--- 开发笔记06(散弹 武器)

    [unity 保卫星城]--- 开发笔记 ~~ 战机武器库 ~~ 2.散弹 · 感觉把好多类,都写再 六 这个主题里,感觉主题会撑爆,所有还是再开个小框架吧. · 就叫战机武器库吧~ ~~ 战机武器库 ...

  6. 【unity 保卫星城】--- 开发笔记07(追踪导弹武器)

    [unity 保卫星城]--- 开发笔记 ~~ 战机武器库 ~~ 3.追踪导弹 ~~ 战机武器库 ~~ 3.追踪导弹 参考大佬的博客:https://blog.csdn.net/sdhexu/arti ...

  7. 【unity 保卫星城】--- 开发笔记05(普通子弹武器)

    [unity 保卫星城]--- 开发笔记 ~~ 战机武器库 ~~ 1.普通的子弹 · 感觉把好多类,都写再 六 这个主题里,感觉主题会撑爆,所有还是再开个小框架吧. · 就叫战机武器库吧~ ~~ 战机 ...

  8. 【unity 保卫星城】--- 开发笔记08(太空站篇)

    [unity 保卫星城]--- 开发笔记 保卫星城-太空站篇 一.太空站的功能 二.功能的实现 说起来保卫星城最重要的星城还没讲,其实星城就是一个太空站,而我们的任务就是保护太空站不被敌人破坏. 保卫 ...

  9. 【unity 保卫星城】--- 开发笔记02(陀螺仪移动)

    [unity 保卫星城]--- 开发笔记 六.完善类图中的类的功能 1.飞机移动模块 第二版(完善了陀螺仪移动) 六.完善类图中的类的功能 1.飞机移动模块 第二版(完善了陀螺仪移动) using S ...

  10. 【unity 保卫星城】--- 开发笔记(Demo演示篇)

    [unity 保卫星城]- 开发笔记 保卫星城 一.游戏介绍 <保卫星城>是一款移动端2D横板射击类游戏,使用Unity3D引擎开,与一般的打飞机需要躲避子弹不同,本游戏需要玩家控制小飞机 ...

最新文章

  1. hung-yi lee_p22_无监督学习:词嵌入
  2. 麒麟芯片AI首席科学家,解读AI芯片如何让手机更智能
  3. 绍兴袍江计算机培训,绍兴春华电脑基础培训班
  4. gulp.js 的安装以及使用
  5. kibana安装步骤
  6. Linux系统的压缩技术
  7. QT的QHashIterator类的使用
  8. Java基本语法(8)--比较运算符
  9. webview传递参数给html,uniapp与webview之间的相互传值
  10. 【android开发】:android真机测试
  11. 运行yum update出现一下错误信息
  12. 2018想要薪资翻倍?你需要掌握这个技能
  13. java 成绩单_java中用if做成绩单
  14. 【名词解释】7.UML类图
  15. Qt QDebug 打印自定义结构体
  16. JavaCore/HeapDump文件分析工具
  17. 计算机网络应用基础的题,计算机网络应用基础试题
  18. Android Studio与夜神模拟器联合调试
  19. 互联网人必备的六大类专业搜索工具
  20. Flutter学习(三)

热门文章

  1. wap2app是什么
  2. 开源自己的一个小android项目(美女撕衣服游戏)
  3. Giesecke Devrient推出全球首张Nano SIM卡,比Micro SIM卡小1/3
  4. java计算机毕业设计教育机构管理源码+mysql数据库+系统+lw文档+部署
  5. VS2010 SP1安装卡在VS10Sp1-KB983509处的解决(转)
  6. Win10系统下如何安装鼠标指针主题包
  7. STM32蜂鸣器驱动程序
  8. 时间单位的换算(秒,毫秒,微秒,纳秒,皮秒)
  9. 牛客网华为机试题整理
  10. TDL信道模型和CDL信道模型