行业知识
Unity-PDF分割器(iTextSharp)
2026-10-22 04:37:52
来源:互联网转载
PDF分割器
- Unity-PDF分割器
- 前言
- 核心思路
- 解决过程
- 一、Unity安装iTextSharp
- 二、运行时计算将要生成文件的大小
- 三、分割核心代码
- 四、使用StandaloneFileBrowser
- 五、其他的一些脚本
- 六、游戏界面主体的构建
- MainWindow
- WarningPanel & FinishPanel
- By-Round Moon
Unity-PDF分割器
PDFSplitter 资源包下载链接【CSDN】免费
前言
最近有这么一个需求,PDF太大了,需要拆分成多份,要求每份的PDF不大于10MB。刚开始,我认为这应该很简单,但是足足耗费了一天的时间去解决该问题。
核心思路
首先是核心部分当然是PDF如何进行分割了,不仅仅要分割,还要统计分割的大小。然后我还不想伤硬盘,直接写在硬盘上判断文件是否超过了大小,然后回溯。所以我只能在运行的时候检测文件大小。核心部分的难度基本如上所述。下面来讲解一下我是如何解决这个问题的吧。还有一个最难的问题,那就是如何不用UnityEditor库来打开FilePanel又叫FileDialog。
解决过程
一、Unity安装iTextSharp
首先在Visual Studio Community中安装.NET 桌面开发,用来下载需要的dll。当然也可以直接在Unity中打开VS后下载,我这其实是脱裤子放屁,但是我想保持Unity的干净,不想事后卸载删除,所以我采用了这个方法。
安装完成后创建一个控制台应用。
将框架选为.NET Framework 2.0。
打开后,在 工具》NuGet包管理器》管理解决方案的NuGet程序包。在浏览中搜索iTextSharp并安装。安装完成后,在.sln文件的同路径下有一个packages包,把里面BouncyCastle.1.8.9和iTextSharp.5.5.13.3的lib文件夹下的.dll文件拷贝到Unity项目的Plugins(自己创建)文件夹中。
二、运行时计算将要生成文件的大小
明确已知,没有提供方法来确定生成后的大小。但是我们可以先在MemoryStream中存储一下,并获取MemoryStream空间所消耗的大小。
下面给出示例代码。
long GetMemorySize(string inputFilePath) { PdfReader reader = new PdfReader(inputFilePath); Document document = new Document(); MemoryStream memoryStream = new MemoryStream(); PdfCopy copy = new PdfCopy(document, memoryStream); document.Open(); copy.AddPage(copy.GetImportedPage(reader, 1));//这里页码是从1到最后的,不是常规的从0开始。 long memorySize = memoryStream.Length; reader.Close(); document.Close(); memoryStream.Close(); return memorySize; }三、分割核心代码
这份脚本为PDFSplitter。将来挂在GameController空物体上。
using UnityEngine;using System.IO;using iTextSharp.text;using iTextSharp.text.pdf;using UnityEngine.UI;using System.Collections.Concurrent;using System.Collections;public class PDFSplitter : MonoBehaviour{ private string inputFilePath; private string outputDirectory; private long maxFileSizeMB = 10 * 1024 * 1024; private PdfReader reader; public InputField from; public InputField save; public Slider slider; private ConcurrentQueue resultQueue = new ConcurrentQueue(); public void Splitter() { System.Threading.Thread thread = new System.Threading.Thread(Run); thread.Start(); StartCoroutine(updateSlider()); } IEnumerator updateSlider() { float res; while (true) { while (!resultQueue.TryDequeue(out res)) ; if (res