Unity--Pdf文件转图片

来源:互联网 发布:怎么用c语言玩单片机 编辑:程序博客网 时间:2024/05/29 05:09

记录下最近做的在Unity中通过转换Pdf文件为图片的方式以显示文档的方法,供以后参考。

网上相关的插件不算多,也不算少,我采用的是Github上的PdfiumViewer插件,因为该插件是在C#基础上对pdf文档做显示、放大等常规操作,而我只需要在Unity中显示就行,所以去除了其中大部分功能,因能力问题,去除方式有些粗糙。如有需要,可在这里下载。

准备

  1. 导入pdfium.dll,PdfiumViewerForUnity.dll到Assets/Plugins/x64目录下,注意二者需在同一目录下;
  2. 因为我是采用插件生成Bitmap再转换为Sprite的方式,所以还需导入System.Drawing.dll文件;
  3. PlayerSetting中的API Compatibility Level设置为”.NET 2.0”;

遇到的问题

因技术和人品问题,我比较“擅长”踩坑,这里记录下以供参考:
1.最开始测试的时候,编辑器中运行一次,正常得到结果,再运行就会报错”dll not found”,需要将PdfiumViewerForUnity.dll拖出目录运行一次,再拖回去,就正常了,原因不明;
2.pdfium.dll需要复制到程序或工程的根目录下,否则无法正常使用,我在使用中同时保留了Plugins/x64中原本,至于是否仅放在根目录下即可,有兴趣可自行测试;
3.API Compatibility Level设置为”.NET 2.0 Subset”,无法正常使用;
4.我是将转换的图片再转成Texture2D,然后赋值为UGUI的Image组件,这种方式会出现需要手动调节下Image的Color值或者禁用Image再启用等方式(应该就是重新渲染)才可正常显示图片的问题,如果使用Sprite,则正常,原因不明;

主要步骤

一、参考PdfiumViewer工程,使用NuGet的方式获取pdfium.dll文件(对应命令为:Install-Package PdfiumViewer -Version 2.12.0,参考这里),编写自己的PdfiumViewerForUnity类库,因为只是用于测试转换图片的主要功能,加上技术水平较低,所以方式比较粗暴,如有下载的朋友,可自行美化一番;
二、将PdfiumViewerForUnity.dll导入pdfium同目录下,Unity中配置好相关组件后编写代码。
三、代码如下:

using UnityEngine;using PdfiumViewerForUnity;using UnityEngine.UI;using System.IO;public class PDFManager : MonoBehaviour {    public UnityEngine.UI.Image img_Show;    public int pageIndex;    void Awake () {        PrepareDll();    }    public void OpenPDF(string filePath)    {        //实例化类,并加载本地pdf文件,filePath即文件路径        PdfViewer pdfViewer = new PdfViewer();        pdfViewer.Document = PdfDocument.Load(filePath);oad(filePath);        //转换为Bitmap        System.Drawing.Bitmap img = pdfViewer.Document.Render(pageIndex, 1024, 1024, PdfRenderFlags.ForPrinting);        //转换为流,再获取byte[],这里我试过img.LockBits的方式,不行        MemoryStream stream = new MemoryStream();        img.Save(stream,System.Drawing.Imaging.ImageFormat.Bmp);        byte[] buffer = stream.GetBuffer();        stream.Close();        //转换成Texture2D        Texture2D tex = new Texture2D(1024, 1024, TextureFormat.ARGB32, false);        tex.LoadRawTextureData(buffer);        tex.Apply();        //转换成Sprite        Sprite sp = Sprite.Create(tex,new Rect(0,0,tex.width,tex.height),Vector2.zero);        //img_Show.material.mainTexture = tex;        img_Show.sprite = sp;    }    private void PrepareDll()    {        //检查pdfium.dll是否在程序根目录下        string destPath = Path.GetDirectoryName(Application.dataPath) + "/pdfium.dll";        if (File.Exists(destPath))        {            return;        }        string pluginPath = Application.dataPath;#if UNITY_EDITOR        pluginPath += "/Plugins/x64/pdfium.dll";#elif UNITY_STANDALONE_WIN        pluginPath += "/Plugins/pdfium.dll";#endif        if (File.Exists(pluginPath)        {            File.Copy(pluginPath, destPath);        }    }}

四、结果如下:
CSDN的Markdown编辑器有bug,我在这里回车或者插入图片,结果会在其它地方插入,还会覆盖掉一个字符,所以没有结果图片展示了。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 不小心把电脑ie浏览器删了怎么办 华为手机自带浏览器中病毒了怎么办 手机打开浏览器提示中病毒了怎么办 手机卸载了浏览器和软件商店怎么办 房东在我租房期间贴房子出租怎么办 额头上毛孔大 还有些黑怎么办 孩子学跳舞老师压的疼怎么办 步步高点读机电池坏了怎么办 电脑连接受限制或无连接怎么办 电脑无线网受限制或无连接怎么办 电脑网络受限制或无连接怎么办 3 证书报考大专证书丢了怎么办 广工期末考试被老师警告了怎么办 我在农村不当队长我能力不够怎么办 我在农村不当队长我当代表怎么办 北京本地人社保中间断了一年怎么办 我想把大哥的孩子带出国要怎么办 美国有亲戚想让孩子出国怎么办 连接温控器的线断了怎么办 植发后好多原生发都脱落了怎么办 4岁宝宝支体能力差怎么办 当与游客发生矛盾时员工怎么办 顾客与同事发生矛盾你该怎么办 当一个人犯下的过错难以原谅怎么办 开车把别人撞成植物人了该怎么办 结婚证丢了孩子上不上学了怎么办 办房产证前加户主姓名怎么办手续 孩子上学户口跟房产不在一起怎么办 我家小孩被别的家长打了怎么办 要是小孩骗家长说老师打他怎么办 孩子在学校被家长打小孩怎么办 小孩在学校被老师打淤青家长怎么办 小孩和家长一吵架就说死怎么办 王者荣耀号被别人家长联接了怎么办 儿子12岁总是跟大人顶嘴怎么办 课堂上有学生和你顶嘴你怎么办 小孩看到大人吵架就哭了 怎么办 五年级的孩子叛逆爱发脾气怎么办 6个月孩子多动怎么办呀 小孩被大人打了很生气该怎么办 小孩在学校调皮被老师打了怎么办