在给学校制作虚拟教学项目时,需要将学生成绩与填写的答案生成PDF文件进行保存。只存文字又不太好看,就将学校logo放进行,情绪价值满满。
在实现过程中遇到很多小的问题,记录下来供后人提供解决方法。
本文使用的脚本主要来自这篇文章:Unity之创建与导出PDF
在此基础上进行优化更改。后续会写出更加完整详细的代码。
下面记录问题!
一:生成不了中文
默认字体是生成不了中文的,需要下载一个中文字体,我这里使用的是小米官方字体,同时摆脱了商用的侵权风险。下载字体后,放入Unity文件夹中。
二:生成的PDF只能在编辑器模式下使用,打包后无法使用
打包后的文件一直提示编码问题
经查找发现是设置字体时,传递的路径问题,无法识别到我所给的字体路径
#region 设置字体
/// <summary>
/// 设置字体
/// </summary>
public void SetBaseFont(string path)
{
basefont = BaseFont.CreateFont(path, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}
无论字体文件是放到Plugins文件夹还是Resources文件夹,均无法使用代码传递路径。
解决方法:
在生成脚本中不使用代码传递路径,直接在构造函数的脚本中指定字体路径。
#region 设置字体
private string fontPath = Application.streamingAssetsPath + "/Fonts/SimSun.ttf";
/// <summary>
/// 设置字体
/// </summary>
public void SetBaseFont(string path)
{
// basefont = BaseFont.CreateFont(path, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
basefont = BaseFont.CreateFont(fontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
}
三:无法生成图片
与问题二一样,生成图片在编辑器模式下可用,在打包后,提示编码问题。经查证,同样是使用构造函数时,传递的图片路径无法识别。
构造函数代码:
/// <summary>
/// 添加图片
/// </summary>
/// <param name="path">图片路径</param>
/// <param name="Alignment">对齐方式(1为居中,0为居左,2为居右)</param>
/// <param name="newWidth">图片宽</param>
/// <param name="newHeight">图片高</param>
public Image AddImage(string imagePath, int Alignment, int fitWidth, int fitHeight)
{
if (!File.Exists(imagePath))
{
Debug.Log("该路径下不存在指定图片,请检测路径是否正确!");
return null;
}
Debug.Log("检查图片路径"+ imagePath);
Image image = Image.GetInstance(imagePath);
image.ScaleToFit(fitWidth, fitHeight);
image.Alignment = Alignment;
document.Add(image);
return image;
}
解决方法:
具体出报错的代码时这一段:
Image image = Image.GetInstance(imagePath);
GetInstance方法无法识别传递过来的图片路径,这次我们不使用指定路径的方法,太过死板。
GetInstance方法除了传递图片的路径,还可以接受图片的字节数组(byte[]
),我们将图片信息处理为byte[],
就可以正常使用构造的函数了。
增加的构造函数代码:
/// <summary>
/// 纹理添加图片
/// </summary>
/// <param name="imagePath"></param>
/// <param name="Alignment"></param>
/// <param name="fitWidth"></param>
/// <param name="fitHeight"></param>
/// <returns></returns>
public Image AddImage(byte[] imageBytes, int Alignment, int fitWidth, int fitHeight)
{
Image image = Image.GetInstance(imageBytes);
image.ScaleToFit(fitWidth, fitHeight);
image.Alignment = Alignment;
document.Add(image);
return image;
}
图片字符化处理:
Texture2D UIImage2d = Resources.Load<Texture2D>("logo");
byte[] imageBytes = UIImage2d.EncodeToPNG();
Image image2= pdf.AddImage(imageBytes,1, 400, 200);
这样就解决了读取图片的问题~