一、 插件准备工作
- 使用VS,在.NETFramework框架下创建一个控制台应用程序; 依次点击
- 工具->NuGet包管理器->管理解决方案的NuGet程序包; 选择浏览菜单,搜索 iTextSharp,找到后点击安装;
- 打开VS项目文件夹,在packages文件夹中
找到BouncyCastle.1.8.9和iTextSharp.5.5.13.3文件夹依次打开并提取lib文件夹中的dll文件。BouncyCastle.Crypto.dll和itextsharp.dll - 将dll文件放在Unity项目的Plugins文件夹下。
- 打开自己的unity编辑器目录“ \Editor\Data\MonoBleedingEdge\lib\mono\unityjit”,将"CodePages.dll"提取到unity项目的Plugins文件下(中文支持)。
二 、创建PDF表单
- 新建“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);
四、 表单文本域赋值(填写),并添加中文支持
- 添加中文支持
Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
BaseFont font = BaseFont.CreateFont("C:\\WINDOWS\\FONTS\\STSONG.TTF",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
- 文本域赋值(填写)
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");
pdfStamper.FormFlattening = true;
pdfStamper.Close();
五、标题图像域赋值(填写)
- 采用的思想是拷贝该图像域,修改好后直接替换。直接修改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)
{
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";
process.Start();
process.Close();
}
七、 画图
PdfContentByte content = pdfStamper.GetOverContent(1);
BaseColor strokeColor = new BaseColor(0f, 1f, 0f,1f);
content.SetColorStroke(strokeColor);
content.SetLineWidth(3);
content.MoveTo(0, 0);
content.LineTo(50, 50);
content.LineTo(300, 100);
content.Stroke();
八、文档占用检测
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)
{
FillPDFFields();
WaitUntil wait = new WaitUntil(()=> CanOpenDocument(path));
yield return wait;
Debug.Log("成功打开后执行后续操作");
}
参考文献
- 插件准备工作:https://blog.csdn.net/weixin_43796392/article/details/124339525
- PDF表单创建:https://www.cnblogs.com/loyung/p/6879917.html
- 中文字库解决方案:https://blog.csdn.net/qq_36479244/article/details/105638588
- 图像域赋值解决方案:https://www.it1352.com/1807525.html
- CodePages依赖引入错误解决方案:https://blog.csdn.net/u011588551/article/details/109689452
声明:本篇文章为学习笔记,有错误或更好的方法请大佬们在评论区踢我下
|