Unity-PDF分割器(iTextSharp)

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.9iTextSharp.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<float> resultQueue = new ConcurrentQueue<float>();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 < 0){slider.value = 1.0f;GetComponent<GameController>().showFinishPanel = true;break;}slider.value = res;yield return null;}}public void Run(){int cnt = 1;int pre = 1;float rate;inputFilePath = from.text;outputDirectory = save.text;reader = new PdfReader(inputFilePath);PdfReader.unethicalreading = true;Document document = null;MemoryStream memoryStream = null;PdfCopy copy = null;int pageCount = reader.NumberOfPages;for (int i = 1; i <= pageCount; i++){if (document == null){document = new Document();memoryStream = new MemoryStream();copy = new PdfCopy(document, memoryStream);document.Open();copy.AddPage(copy.GetImportedPage(reader, i));}else{copy.AddPage(copy.GetImportedPage(reader, i));if (memoryStream.Length > maxFileSizeMB){PDF_Writer(pre, i - 1, cnt++.ToString("00"));document.Close();memoryStream.Close();document = null;memoryStream = null;copy = null;pre = i--;}}rate = 1.0f * i / pageCount;resultQueue.Enqueue(rate);}document.Close();PDF_Writer(pre, pageCount, cnt.ToString("00"));reader.Close();resultQueue.Enqueue(-1.0f);}void PDF_Writer(int start, int end, string name){Document document = new Document();PdfCopy copy = new PdfCopy(document, new FileStream(outputDirectory + $"//{name}.pdf", FileMode.Create));document.Open();for (int i = start; i <= end; i++)copy.AddPage(copy.GetImportedPage(reader, i));document.Close();}
}

四、使用StandaloneFileBrowser

首先在Github链接中下载StandaloneFileBrowser。
在这里插入图片描述
之后,就将下载的Packages直接拖进项目中导入。
用这个包之后为了能够打包成功我们需要将Unity的.Net框架改为 .Net 4.x在这里插入图片描述
    我们这里只需要使用StandaloneFileBrowser.OpenFilePanelStandaloneFileBrowser.OpenFolderPanel
可能导入时候会出一些莫名其妙的错误,不用在意,只要能编译正常用,打包正常打出去,就可以。奇怪的是打包成功之后这些错误莫名其妙的消失掉了。


这份脚本为PathBar。将来挂在涉及路径选择的自定义物体上。

using UnityEngine;
using UnityEngine.UI;
using SFB;public class PathBar : MonoBehaviour
{[HideInInspector]public string path;public InputField info;public void SelectFilePath(){var extensions = new[] { new ExtensionFilter("PDF Files", "pdf"), new ExtensionFilter("All Files", "*") };path = StandaloneFileBrowser.OpenFilePanel("Open PDF File", "", extensions, false)[0];info.text = path;}public void SelectFolderPath(){path = StandaloneFileBrowser.OpenFolderPanel("Select save Folder", "", false)[0];info.text = path;}}

五、其他的一些脚本

这份脚本为GameController 。将来挂在GameController空物体上。

using System.Collections;
using UnityEngine;
using UnityEngine.UI;
using System.IO;
public class GameController : MonoBehaviour
{public GameObject FinishPanel;public GameObject WarningPanel;[HideInInspector]public bool showFinishPanel;public InputField from;public InputField save;public void Run(){if (!File.Exists(from.text) || !Directory.Exists(save.text) || Path.GetExtension(from.text).ToLower() != ".pdf"){WarningPanel.GetComponent<PanelController>().Open();return;}showFinishPanel = false;GetComponent<PDFSplitter>().Splitter();StartCoroutine(ShowFinishPanel());}IEnumerator ShowFinishPanel(){while (!showFinishPanel)yield return null;FinishPanel.GetComponent<PanelController>().Open();}
}

这份脚本为PanelController 。将来挂在一些用来提示的物体上。

using UnityEngine;public class PanelController : MonoBehaviour
{public void Close(){gameObject.SetActive(false);}public void Open(){gameObject.SetActive(true);}
}

六、游戏界面主体的构建

MainWindow

在这里插入图片描述
界面如下,很好拆分上面的我称之为PathBar,用来选择路径。
中间是Button,用来执行分割操作。
最底下是进度条,可以参考B站视频 BV1iW411D78W大概在55分钟左右会有讲解。我这里多做了一步操作,把slider的图片全部设置成了None。
下面看一下我的目录结构
在这里插入图片描述

WarningPanel & FinishPanel

在这里插入图片描述
在这里插入图片描述
下面看一下我的目录结构
在这里插入图片描述
PDFSplitter 资源包下载链接【CSDN】免费

By-Round Moon

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/498440.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

开源大数据集群部署(十三)Ranger 集成Trino

作者&#xff1a;櫰木 1、安装ranger trino插件 在trino的coordinator节点部署 解压ranger-2.3.0-trino-plugin.tar.gz [roothd2.dtstack.com ]#tar -zxvf ranger-2.3.0-trino-plugin.tar.gz -C /opt配置ranger trino插件文件install.properties&#xff0c;内容如下 &…

【多智能体】MetaGPT配置教程(应用智谱AI的GLM-4)

MetaGPT配置教程&#xff08;使用智谱AI的GLM-4&#xff09; 文章目录 MetaGPT配置教程&#xff08;使用智谱AI的GLM-4&#xff09;零、为什么要学MetaGPT一、配置环境二、克隆代码仓库三、设置智谱AI配置四、 示例demo&#xff08;狼羊对决&#xff09;五、参考链接 零、为什么…

Java Web(十一)--JSON Ajax

JSON JSon在线文档&#xff1a; JSON 简介 JSON(JavaScript Object Notation, JS 对象标记) 是一种轻量级的数据交换格式。轻量级指的是跟xml做比较。数据交换指的是客户端和服务器之间业务数据的传递格式。 它基于 ECMAScript (W3C制定的JS规范)的一个子集&#xff0c;采…

spring boot 整合 minio存储 【使用篇】

zi导入依赖 <!--minio--><dependency><groupId>io.minio</groupId><artifactId>minio</artifactId><version>8.0.3</version></dependency> yml配置&#xff08;默认配置&#xff09; spring:# 配置文件上传大小限制s…

[CISCN2019 华北赛区 Day2 Web1]Hack World 1 题目分析与详解

一、分析判断 进入靶机&#xff0c;主页面如图&#xff1a; 主页面提供给我们一条关键信息&#xff1a; flag值在 表flag 中的 flag列 中。 接着我们尝试输入不同的id&#xff0c;情况分别如图&#xff1a; 当id1时&#xff1a; 当id2时&#xff1a; 当id3时&#xff1a; 我…

AI短视频矩阵运营软件|抖音视频矩阵控制工具

【罐头鱼AI传单功能介绍】 罐头鱼AI传单是一款专为短视频矩阵运营而设计的智能软件&#xff0c;旨在帮助用户高效管理和运营多个抖音账号&#xff0c;并提供一系列强大的功能来优化视频内容创作和发布流程。QQ:290615413以下是软件框架&#xff0c;详细介绍其功能和特点&#…

Sectigo SSL证书有什么优势?

在全球范围内&#xff0c;Sectigo作为一家备受信赖的数字证书颁发机构&#xff0c;以其强大的安全性、出色的性价比和卓越的品牌形象赢得了广大用户的青睐。本文将深入剖析Sectigo SSL证书在这些方面的卓越表现。 一、安全性 1. 强大加密技术 Sectigo SSL证书采用行业标准的加…

SDR架构 (二) 为什么很多SDR频谱中间有尖峰?

相信大家第一次打开gnuradio看听广播、看频谱的时候&#xff0c;会注意到一个奇怪的现象&#xff0c;明明在频谱中间不该有信号&#xff0c;但是实际看到了一个尖峰。这个尖峰不含带任何信息&#xff0c;并且不管调节到哪个中心频率&#xff0c;这个尖峰都会存在。 这种情况出…

【Unity实战】UGUI和Z轴排序那点事儿

如果读者是从Unity 4.x时代过来的&#xff0c;可能都用过NGUI这个插件&#xff08;后来也是土匪成了正规军&#xff09;&#xff0c;NGUI一大特点是可以靠transform位移的Z值进行遮挡排序&#xff0c;然而这个事情在UGUI成了难题&#xff08;Sorting Layer、Inspector顺序等因素…

Linux系统Docker部署StackEdit Markdown并实现公网访问本地编辑器

文章目录 前言1. ubuntu安装VNC2. 设置vnc开机启动3. windows 安装VNC viewer连接工具4. 内网穿透4.1 安装cpolar【支持使用一键脚本命令安装】4.2 创建隧道映射4.3 测试公网远程访问 5. 配置固定TCP地址5.1 保留一个固定的公网TCP端口地址5.2 配置固定公网TCP端口地址5.3 测试…

RDMA内核态函数ib_post_send()源码分析

最近调用linux内核下RDMA的Verb API ib_post_send()出现了问题&#xff0c;因此从源码分析一下这个函数的调用过程。 我使用的内核版本为5.15.0-94 这是函数ib_post_send的头文件定义&#xff0c;这个函数的意义是向发送队列提交发送请求&#xff0c;他会调用qp对应设备的post_…

[Vulnhub]靶场 Web Machine(N7)

kali:192.168.56.104 主机探测: arp-scan -l 靶机ip:192.168.56.104 端口扫描 nmap -p- 192.168.56.106 看一下web 目录扫描 gobuster dir -u http://192.168.56.106 -x html,txt,php,bak,zip --wordlist/usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt exp…