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.mzph.cn/news/718436.shtml

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

相关文章

基于主从模式的Reactor的仿muduo网络库

&#x1f307;个人主页&#xff1a;平凡的小苏 &#x1f4da;学习格言&#xff1a;命运给你一个低的起点&#xff0c;是想看你精彩的翻盘&#xff0c;而不是让你自甘堕落&#xff0c;脚下的路虽然难走&#xff0c;但我还能走&#xff0c;比起向阳而生&#xff0c;我更想尝试逆风…

【.NET Core】.NET中的流(Stream)

【.NET Core】.NET中的流&#xff08;Stream&#xff09; 文章目录 【.NET Core】.NET中的流&#xff08;Stream&#xff09;一、流&#xff08;Stream&#xff09;1.1 FileStream类1.2 IsolatedStorageFileStream类1.3 MemoryStream类1.4 BufferedStream类1.5 NetworkStream类…

谷歌浏览器打开,图片糊了

现象&#xff08;问题&#xff09;&#xff1a;早上开机&#xff0c;打开谷歌浏览器发现里面的所有图片相关的都糊了&#xff0c;离谱&#xff01; 查阅一番资料后发现&#xff1a; 谷歌浏览器的硬件加速模式被打开了 解决&#xff1a; 打开谷歌浏览器->设置->系统->…

【C++从练气到飞升】01---C++入门

&#x1f388;个人主页&#xff1a;库库的里昂 ✨收录专栏&#xff1a;C从练气到飞升 &#x1f389;鸟欲高飞先振翅&#xff0c;人求上进先读书。 目录 推荐 前言 什么是C C的发展史 &#x1f4cb;命名空间 命名空间定义 命名空间使用 命名空间的嵌套 std命名空间的使用 &#…

编译 qsqlmysql.dll QMYSQL driver not loaded

Qt 连接MySQL数据库&#xff0c;没有匹配的qsqlmysql.dll, 需要我们跟进自己Mysql 以及QT版本自行编译的。异常如下图&#xff1a; 安装环境为 VS2019 Qt5.12.12&#xff08;msvc2017_64、以及源码&#xff09; 我的安装地址&#xff1a;D:\Qt\Qt5.12.12 Mysql 8.1.0 默认安…

2023年下半年教师资格证考试《教育知识与能力》(中学)题

3.李老师在初二选择了人数、性别比例、学习成绩、教材各方面情况相同的两个班进行教学&#xff0c;对其中一班采用讲授法&#xff0c;对另一个班采用自学辅导法&#xff0c;经过一个阶段的教学后进行测验&#xff0c;以比较两种方法教学效果&#xff0c;李老师采用的方法属于&a…

基于yolov5的飞机蒙皮缺陷检测系统,可进行图像目标检测,也可进行视屏和摄像检测(pytorch框架)【python源码+UI界面+功能源码详解】

功能演示&#xff1a; 基于yolov5的飞机蒙皮缺陷检测系统&#xff0c;系统既能够实现图像检测&#xff0c;也可以进行视屏和摄像实时检测_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 基于yolov5的飞机蒙皮缺陷检测系统是在pytorch框架下实现的&#xff0c;这是一个完…

js【详解】自动类型转换

运算符 Symbol 数字 会报错 Cannot convert a Symbol value to a number Symbol 字符串 会报错 Cannot convert a Symbol value to a string 存在对象&#xff0c;数组&#xff0c;函数时 对象&#xff0c;数组&#xff0c;函数会先执行其 toString() 方法&#xff0c;…

用CSS实现一个扇形

用CSS实现扇形的思路和三角形基本一致&#xff0c;就是多了一个圆角的样式&#xff0c;实现一个90的扇形&#xff1a; div{border: 100px solid transparent;width: 0;heigt: 0;border-radius: 100px;border-top-color: red; }

【c++】list模拟实现

list的接口 #pragma once #include<iostream> #include<assert.h> using namespace std; namespace zjw {template<class T>struct listnode {listnode* <T>_next;listnode* <T>_prev;T _data;listnode(const T& x T()):_prev(nulllptr…

高维中介数据: 联合显着性(JS)检验法

摘要 中介分析在流行病学和临床试验中越来越受到关注。在现有的中介分析方法中&#xff0c;流行的联合显着性&#xff08;JS&#xff09;检验会产生过于保守的 I 类错误率&#xff0c;因此功效较低。但是&#xff0c;如果在使用 JS 测试高维中介假设时&#xff0c;可以准确控制…

人力资源(E-HR)应用架构的设计与实践

当谈到人力资源管理时&#xff0c;电子人力资源&#xff08;E-HR&#xff09;系统已经成为现代企业不可或缺的组成部分。E-HR系统的设计与实践对于提高组织的人力资源管理效率和员工体验至关重要。本文将探讨E-HR应用架构的设计与实践&#xff0c;以及如何借助信息技术优化人力…

怎么使用Pyecharts库对淘宝数据进行可视化展示

目录 一、准备工作 二、数据预处理 三、使用Pyecharts进行可视化展示 柱状图展示销量和评价数 散点图展示价格与销量关系 词云图展示商品标题关键词 四、总结与建议 在当今的大数据时代&#xff0c;数据可视化已经成为了一个非常重要的技能。Pyecharts是一个基于Python的…

C++ //练习 10.24 给定一个string,使用bind和check_size在一个int的vector中查找第一个大于string长度的值。

C Primer&#xff08;第5版&#xff09; 练习 10.24 练习 10.24 给定一个string&#xff0c;使用bind和check_size在一个int的vector中查找第一个大于string长度的值。。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /*****…

Altium Designer 22焊接辅助工具 Interactivehtmlbom 插件使用教程

目录 AD22 由Interactivehtmlbom 插件生成的焊接辅助图&#xff0c;交互方式很多&#xff0c;十分方便的为我们提供便利。 介绍安装教程&#xff1a; 前去这个网站 Interactivehtmlbom 插件&#xff0c;单击下载zip 下载完成后找个地方解压&#xff0c;双击Initablelize.bat文…

河道水库雨水情自动测报系统

随着科学技术的不断进步&#xff0c;以及城市化进程的影响&#xff0c;水库的管理变得更加复杂&#xff0c;要实现城市水库的精细化管理&#xff0c;必须借助先进的信息技术手段为支撑&#xff0c;实现对三防、水资源、供水安全的实时监控&#xff0c;优化管理模式和创新管理手…

Matlab 机器人工具箱 例程:运动学+动力学+路径规划+可视化

文章目录 1 创建机器人2 机器人显示3 机器人示教4 机器人路径规划&#xff1a;给定关节角路径5 机器人路径规划&#xff1a;给定末端位姿&#xff0c;求关节角路径6 工作空间可视化参考链接 1 创建机器人 clc;clear;close all; deg pi/180;L1 Revolute(d, 0, a, 0, alpha, 0,…

【Python】快速入门Python一天学完基础语法

文章目录 前言1. HelloWorld2. 变量与数据类型2.1 变量2.2 数据类型2.2.1 String 字符串类型2.2.2 基本类型转换2.2.2 元组2.2.3 字典2.2.4 拆包 2.3 运算2.3.1 双除号/双乘号2.3.2 常见运算函数举例2.3.3 布尔运算 3. 控制流程3.1 if-else 语句3.2 while 循环3.3 for 循环 4. …

逆变器专题(14)-弱电网下的LCL逆变器控制以及谐振峰问题(1)

相应仿真原件请移步资源下载 LCL滤波器 LCL滤波器因其本身为一个二阶系统&#xff0c;其本身就会引发谐振&#xff0c;导致相应谐振频率处的增益得到放大&#xff0c;进而产生谐波等问题&#xff1b;另一方面&#xff0c;在弱电网下&#xff0c;逆变器会与电网阻抗发生耦合&am…

ARM总结and复习

安装交叉编译工具链 a. 为什么安装 因为arm公司的指令集在不断迭代升级&#xff0c;指令集日益增多,而架构是基于指令集研发的&#xff0c;所以架构不一样&#xff0c;指令集也不一样 eg:arm架构使用的是arm指令集 x86架构使用的是x86指令集 而我们日常开发环境中linux的架构…