IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity C# ITextSharp5.5.13 笔记 -> 正文阅读

[游戏开发]Unity C# ITextSharp5.5.13 笔记

一、 插件准备工作

  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不支持表单创建)。
    在这里插入图片描述
    2. 在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);

四、 表单文本域赋值(填写),并添加中文支持

  1. 添加中文支持
		//注册CodePages
		Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
		//创建字体
        BaseFont font = BaseFont.CreateFont("C:\\WINDOWS\\FONTS\\STSONG.TTF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
  1. 文本域赋值(填写)
		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();

五、标题图像域赋值(填写)

  1. 采用的思想是拷贝该图像域,修改好后直接替换。直接修改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();
    }

七、 画图

//画图
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();               //结束笔画 

八、文档占用检测

	/// <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

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

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-09-13 11:49:37  更:2022-09-13 11:50:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/17 3:35:11-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码