Unity之创建与导出PDF

内容将会持续更新,有错误的地方欢迎指正,谢谢!
 

Unity之创建与导出PDF
     
TechX 坚持将创新的科技带给世界!

拥有更好的学习体验 —— 不断努力,不断进步,不断探索
TechX —— 心探索、心进取!

助力快速掌握 PDF 的创建与导出

为初学者节省宝贵的学习时间,避免困惑!


TechX 教程效果:

在这里插入图片描述


文章目录

  • 一、第三方库iTextSharp导入
    • 1、通过Visual Studio的NuGet包管理器下载iTextSharp库
    • 2、导入DLL文件到Unity中
  • 二、使用iTextSharp生成和写入PDF文件的示例
  • 三、写入和导出PDF实战


一、第三方库iTextSharp导入


在Unity中生成PDF文件并写入内容,需要使用第三方库,因为Unity本身不提供直接操作PDF的API。一个常用的库是iTextSharp,这是一个强大的PDF处理库。iTextSharp是iText的C#版本,可以用于创建、修改和读取PDF文档。

1、通过Visual Studio的NuGet包管理器下载iTextSharp库


  1. 打开NuGet包管理器:

    在Visual Studio中,点击Tools菜单,选择NuGet Package Manager,然后选择Manage NuGet Packages for Solution…。

  2. 搜索iTextSharp:

    在打开的NuGet包管理器窗口中,点击Browse选项卡,然后在搜索框中输入iTextSharp。

  3. 安装iTextSharp:

    在搜索结果中找到iTextSharp包,点击Install按钮进行安装。根据提示完成安装过程。

在这里插入图片描述

2、导入DLL文件到Unity中


上一步下载的iTextSharp包在工程目录的Packages下,共包含两个文件夹:BouncyCastle.Cryptography.2.4.0和iTextSharp.5.5.13.4。

在这里插入图片描述

进入BouncyCastle.Cryptography.2.4.0\lib\net461和iTextSharp.5.5.13.4\lib\net461目录中找到BouncyCastle.Cryptography.dll和itextsharp.dll

在这里插入图片描述

将两个DLL文件复制到你的Unity项目的Assets/Plugins文件夹中。如果没有Plugins文件夹,可以创建一个。

在这里插入图片描述



二、使用iTextSharp生成和写入PDF文件的示例


在Unity项目中创建一个C#脚本,例如PDFGenerator.cs。

在脚本中使用iTextSharp来生成和写入PDF。

以下是完整的示例代码:

using UnityEngine;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
using Image = iTextSharp.text.Image;

public class PDFGenerator : MonoBehaviour
{
    void Start()
    {
        // 设置PDF保存路径
        string path = Application.dataPath + "/GeneratedPDF.pdf";
        // 图片路径
        string imgPath = Application.streamingAssetsPath+ "/path_to_image.jpg";
        
        using (FileStream fileStream = new FileStream(path, FileMode.Create))
        {
	        // 创建一个文档对象
	        Document document = new Document();
	        
	        // 创建一个PDF写入流
	        PdfWriter pdfWriter = PdfWriter.GetInstance(document, fileStream );
	        
	        // 打开文档
	        document.Open();
	        
	        // 添加内容到文档
	        document.Add(new Paragraph("Hello, World!"));
	        document.Add(new Paragraph("This is a PDF generated in Unity."));
	        
	        // 添加图片
	        Image image = Image.GetInstance(imgPath );
	        document.Add(image);
	        
	        // 添加表格
	        PdfPTable table = new PdfPTable(3); // 3列的表格
	        table.AddCell("Cell 1");
	        table.AddCell("Cell 2");
	        document.Add(table);
	        
	        //关闭写入流
	        pdfWriter.Close();
	      	// 关闭文档
	        document.Close();
		}
        

        Debug.Log("PDF generated at: " + path);
    }
}



三、写入和导出PDF实战


using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
using UnityEngine;
using Font = iTextSharp.text.Font;
using Rectangle = iTextSharp.text.Rectangle;

namespace PDFExport
{
    /// <summary>
    /// PDF文档操作类
    /// </summary>
    public class PDFOperation
    {
        #region 私有字段
        private Font font = default;
        private PdfWriter pdfWriter;
        private Rectangle documentSize;   //文档大小
        private Document document;//文档对象
        private BaseFont basefont;//字体
        #endregion

        #region 构造函数

        /// <summary>
        /// 构造函数
        /// </summary>
        public PDFOperation()
        {
            documentSize = PageSize.A4;
            document = new Document(documentSize);
        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="type">页面大小(如"A4")</param>
        public PDFOperation(Rectangle size)
        {
            documentSize = size;
            document = new Document(size);
        }

        /// <summary>
        /// 构造函数
        /// </summary>
        /// <param name="type">页面大小(如"A4")</param>
        /// <param name="marginLeft">内容距左边框距离</param>
        /// <param name="marginRight">内容距右边框距离</param>
        /// <param name="marginTop">内容距上边框距离</param>
        /// <param name="marginBottom">内容距下边框距离</param>
        public PDFOperation(Rectangle size, float marginLeft, float marginRight, float marginTop, float marginBottom)
        {
            documentSize = size;
            document = new Document(size, marginLeft, marginRight, marginTop, marginBottom);
        }

        #endregion


        #region 文档操作

        /// <summary>
        /// 创建写入流
        /// </summary>
        /// <param name="os">文档相关信息(如路径,打开方式等)</param>
        public PdfWriter OpenPdfWriter(FileStream os)
        {
            pdfWriter = PdfWriter.GetInstance(document, os);
            return pdfWriter;
        }

        /// <summary>
        /// 关闭写入流
        /// </summary>
        /// <param name="writer"></param>
        public void ClosePdfWriter()
        {
            pdfWriter.Close();
        }

        /// <summary>
        /// 打开文档
        /// </summary>
        public void Open()
        {
            document.Open();
        }

        /// <summary>
        /// 关闭打开的文档
        /// </summary>
        public void Close()
        {
            document.Close();
        }

        #endregion

        #region 设置字体

        /// <summary>
        /// 设置字体
        /// </summary>
        public void SetBaseFont(string path)
        {
            basefont = BaseFont.CreateFont(path, BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
        }

        /// <summary>
        /// 设置字体
        /// </summary>
        /// <param name="size">字体大小</param>
        public Font SetFont(float size)
        {
            font = new Font(basefont, size);
            return font;
        }

        /// <summary>
        /// 设置字体
        /// </summary>
        /// <param name="size"></param>
        /// <param name="style"></param>
        public Font SetFont(float size, int style)
        {
            font = new Font(basefont, size, style);
            return font;
        }

        /// <summary>
        /// 设置字体
        /// </summary>
        /// <param name="size"></param>
        /// <param name="style"></param>
        /// <param name="fontColor"></param>
        public Font SetFont(float size, int style, BaseColor fontColor)
        {
            font = new Font(basefont, size, style, fontColor);
            return font;
        }

        /// <summary>
        /// 获取字体
        /// </summary>
        /// <returns></returns>
        public Font GetFont()
        {
            return font;
        }

        #endregion

        public void AddPage()
        {
            document.NewPage();
        }

        #region 添加段落

        /// <summary>
        /// 空格
        /// 加入空行,用以区分上下行
        /// </summary>
        public void AddNullLine(int nullLine=1,int lightHeight=12)
        {
            // Change this to the desired number of empty lines
            int numberOfEmptyLines = nullLine; 
            for (int i = 0; i < numberOfEmptyLines; i++)
            {
                Paragraph emptyLine = new Paragraph(" ", new Font(Font.FontFamily.HELVETICA, lightHeight));
                document.Add(emptyLine);
            }
        }

        /// <summary>
        /// 插入文字内容
        /// </summary>
        /// <param name="content">内容</param>
        /// <param name="alignmentType">对齐格式,0为左对齐,1为居中</param>
        /// <param name="indent">首行缩进</param>
        public void AddParagraph(string content, int alignmentType = 0,float indent = 0)
        {
            Paragraph contentP = new Paragraph(new Chunk(content, font));
            contentP.FirstLineIndent = indent;
            contentP.Alignment = alignmentType;
            document.Add(contentP);
        }

        /// <summary>
        /// 添加段落
        /// </summary>
        /// <param name="content">内容</param>
        /// <param name="Alignment">对齐方式(1为居中,0为居左,2为居右)</param>
        /// <param name="SpacingAfter">段后空行数(0为默认值)</param>
        /// <param name="SpacingBefore">段前空行数(0为默认值)</param>
        /// <param name="MultipliedLeading">行间距(0为默认值)</param>
        public void AddParagraph(string content, int Alignment, float SpacingAfter, float SpacingBefore, float MultipliedLeading)
        {
            Paragraph pra = new Paragraph(content, font);
            pra.Alignment = Alignment;
            if (SpacingAfter != 0)
            {
                pra.SpacingAfter = SpacingAfter;
            }
            if (SpacingBefore != 0)
            {
                pra.SpacingBefore = SpacingBefore;
            }
            if (MultipliedLeading != 0)
            {
                pra.MultipliedLeading = MultipliedLeading;
            }
            document.Add(pra);
        }
        #endregion

        #region 添加图片

        /// <summary>
        /// 添加图片
        /// </summary>
        /// <param name="path">图片路径</param>
        /// <param name="Alignment">对齐方式(1为居中,0为居左,2为居右)</param>
        /// <param name="newWidth">图片宽(0为默认值,如果宽度大于页宽将按比率缩放)</param>
        /// <param name="newHeight">图片高</param>
        public Image AddImage(string imagePath, int Alignment, float newWidth, float newHeight)
        {
            if (!File.Exists(imagePath))
            {
                Debug.Log("该路径下不存在指定图片,请检测路径是否正确!");
                return null;
            }
            Image img = Image.GetInstance(imagePath);
            img.Alignment = Alignment;
            if (newWidth != 0)
            {
                img.ScaleAbsolute(newWidth, newHeight);
            }
            else
            {
                if (img.Width > PageSize.A4.Width)
                {
                    img.ScaleAbsolute(documentSize.Width, img.Width * img.Height / documentSize.Height);
                }
            }
            document.Add(img);
            return img;
        }

        /// <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;
            }
            Image image = Image.GetInstance(imagePath);
            image.ScaleToFit(fitWidth, fitHeight);
            image.Alignment = Alignment;
            document.Add(image);
            return image;
        }

        #endregion 

        #region Table表

        public void AddTable(PdfPTable table)
        {
            document.Add(table);
        }

        #endregion
    }
}
using iTextSharp.text;
using iTextSharp.text.pdf;
using System;
using System.IO;
using UnityEditor;
using UnityEngine;
using Font = iTextSharp.text.Font;
using Image = iTextSharp.text.Image;

namespace PDFExport
{
    public class ReportExporterPDF: MonoBehaviour
    {
       private string fontPath = Application.streamingAssetsPath + "/Fonts/SIMFANG.TTF";
        string imagePath1 = Application.streamingAssetsPath + "/Images/logo.png";

        private void Start()
        {
            GenerateReportPDF();
        }

        public  void GenerateReportPDF()
        {
           CreatePDF(Application.streamingAssetsPath + "/Report.pdf");
        }


        private void CreatePDF(string filePath)
        {
           	using (FileStream fileStream = new FileStream(filePath, FileMode.Create))
            {
                PDFOperation pdf = new PDFOperation(PageSize.A4, 55f, 55f, 96f, 96f);
                pdf.SetBaseFont(fontPath);
                PdfWriter pdfWriter = pdf.OpenPdfWriter(fileStream);
                pdf.Open();

                HeaderFooterPageEvent headerFooterPageEvent = new HeaderFooterPageEvent(pdf,this);
                pdfWriter.PageEvent = headerFooterPageEvent;

                FirstPasge(pdf);

                pdf.Close();
                pdf.ClosePdfWriter();
#if UNITY_EDITOR
                AssetDatabase.Refresh();
#endif
            }
            Application.OpenURL(filePath);
        }

        #region FirstPage

        private void FirstPasge(PDFOperation pdf)
        {
            pdf.AddNullLine(1, 22);

            Image image1 = Image.GetInstance(imagePath1);

            PdfPTable table = new PdfPTable(1);

            table.DefaultCell.Border = Rectangle.NO_BORDER;
            table.DefaultCell.Padding = 0;
            table.DefaultCell.FixedHeight = 100;

            // 设置图片的缩放比例
            float scale = 0.9f;
            image1.ScaleAbsolute(image1.Width * scale, image1.Height * scale);
            PdfPCell cell1 = new PdfPCell(image1);
            cell1.HorizontalAlignment = 1;
            cell1.PaddingRight = 0;
            cell1.Border = Rectangle.NO_BORDER;
            table.AddCell(cell1);
            pdf.AddTable(table);

            pdf.AddNullLine();
            pdf.SetFont(24);
            pdf.AddParagraph("汽车实验系统", 1);

            pdf.AddNullLine();
            pdf.SetFont(36, Font.BOLD);
            pdf.AddParagraph("实验报告", 1);
            pdf.AddNullLine(3);
            AddMainInfo(pdf);
        }


        public void AddMainInfo(PDFOperation pdf)
        {
            // 创建一个有 2 列的表格
            float[] columnWidths = { 124, 369 };
            PdfPTable table = new PdfPTable(columnWidths);
            table.DefaultCell.Border = Rectangle.NO_BORDER;

            // 设置表格宽度和对齐方式
            table.WidthPercentage = 80;
            table.HorizontalAlignment = Element.ALIGN_CENTER;

            string[] cellContents = {
                "实验名称:", "汽车仿真实验",
                "实验地点:", "",
                "学生姓名:", "",
                "指导教师:", "",
                "所属单位:", "",
                "支持单位:", "XXXX科技大学",
                "支持单位:", "XXXXXX股份有限公司",
                "实验时间:", DateTime.Now.ToString("yyyy年MM月dd日")
            };

            // 用提供的信息添加表格单元格
            for (int i = 0; i < cellContents.Length; i++)
            {
                PdfPCell cell;
                if (i % 2 == 0)
                {
                    pdf.SetFont(14, Font.BOLD);
                    cell = new PdfPCell(new Phrase(cellContents[i], pdf.GetFont()));
                }
                else
                {
                    pdf.SetFont(14, Font.NORMAL);
                    cell = new PdfPCell(new Phrase(cellContents[i], pdf.GetFont()));
                }
                cell.Padding = 10;
                cell.Border = Rectangle.NO_BORDER;
                table.AddCell(cell);
            }

            pdf.AddTable(table);
        }
        #endregion

        #region  页眉页脚

        public class HeaderFooterPageEvent : PdfPageEventHelper
        {
            PDFOperation pdf;
            ReportExporterPDF reportExporter;
            public HeaderFooterPageEvent(PDFOperation pdf, ReportExporterPDF reportExporter)
            {
                this.pdf = pdf;
                this.reportExporter = reportExporter;
            }

            public override void OnEndPage(PdfWriter writer, Document doc)
            {
                base.OnEndPage(writer, doc);

                Header(writer, doc);
                Footer(writer, doc);
            }

            private void Header(PdfWriter writer, Document doc)
            {
                float[] columnWidths = { 25, 200 };

                // 添加带图片和文字的页眉
                PdfPTable headerTable = new PdfPTable(columnWidths);
                headerTable.DefaultCell.Border = Rectangle.NO_BORDER;
                headerTable.WidthPercentage = 100;
                headerTable.HorizontalAlignment = Element.ALIGN_CENTER;

                headerTable.TotalWidth = doc.PageSize.Width - doc.LeftMargin - doc.RightMargin; // Set table width
                headerTable.LockedWidth = true; // Lock the table width

                Image image1 = Image.GetInstance(reportExporter.imagePath1);

                // Add images to the header
                image1.ScaleAbsolute(image1.Width / 2, image1.Height / 2);
                PdfPCell imageCell1 = new PdfPCell(image1);
                imageCell1.Border = Rectangle.NO_BORDER;

                // Add text to the header
                pdf.SetFont(10, Font.NORMAL, BaseColor.GRAY);
                Font headerFont = pdf.GetFont();

                PdfPCell textCell = new PdfPCell(new Phrase("XXXXXX股份有限公司", headerFont));
                textCell.HorizontalAlignment = Element.ALIGN_RIGHT;
                textCell.VerticalAlignment = Element.ALIGN_BOTTOM;
                textCell.Border = Rectangle.NO_BORDER;

                headerTable.AddCell(imageCell1);
                headerTable.AddCell(textCell);

                headerTable.WriteSelectedRows(0, -1, doc.Left, doc.Top + 60, writer.DirectContent);
            }

            private void Footer(PdfWriter writer, Document doc)
            {
                // Add footer with page number
                PdfPTable footerTable = new PdfPTable(1);
                footerTable.DefaultCell.Border = Rectangle.NO_BORDER;
                footerTable.WidthPercentage = 100;
                footerTable.HorizontalAlignment = Element.ALIGN_CENTER;
                footerTable.TotalWidth = doc.PageSize.Width - doc.LeftMargin - doc.RightMargin; // Set table width
                footerTable.LockedWidth = true; // Lock the table width

                int pageNumber = writer.PageNumber;
                int totalPages = writer.CurrentPageNumber; // Exclude the cover page

                pdf.SetFont(9, Font.NORMAL, BaseColor.GRAY);
                Font footFont = pdf.GetFont();
                PdfPCell footerCell = new PdfPCell(new Phrase($"{totalPages}", footFont));
                footerCell.HorizontalAlignment = Element.ALIGN_CENTER;
                footerCell.Border = Rectangle.NO_BORDER;

                footerTable.AddCell(footerCell);

                footerTable.WriteSelectedRows(0, -1, doc.Left, doc.Bottom - 50, writer.DirectContent);
            }
        }
        #endregion
    }
}




TechX —— 心探索、心进取!

每一次跌倒都是一次成长

每一次努力都是一次进步

END
感谢您阅读本篇博客!希望这篇内容对您有所帮助。如果您有任何问题或意见,或者想要了解更多关于本主题的信息,欢迎在评论区留言与我交流。我会非常乐意与大家讨论和分享更多有趣的内容。
如果您喜欢本博客,请点赞和分享给更多的朋友,让更多人受益。同时,您也可以关注我的博客,以便及时获取最新的更新和文章。
在未来的写作中,我将继续努力,分享更多有趣、实用的内容。再次感谢大家的支持和鼓励,期待与您在下一篇博客再见!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024-2025年本田维修电路图线路图接线图资料更新

此次更新了2024-2025年本田车系电路图资料&#xff0c;覆盖市面上99%车型&#xff0c;包括维修手册、电路图、新车特征、车身钣金维修数据、全车拆装、扭力、发动机大修、发动机正时、保养、电路图、针脚定义、模块传感器、保险丝盒图解对照表位置等等&#xff01; 汽修帮手汽…

日期和时区

日期 时区 修改时区可分为两步 删除系统自带的 localtime 文件 rm -f /etc/localtime 将系统中内置的 Shanghai 文件软连接到 /etc/localtime中 sudo ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

Unity3D中,AI角色Rigidbody旋转导致的动画问题

在制作一些AI角色的时候&#xff0c;可能会运用到Rigidbody组件来使AI角色拥有一些相关的物理属性&#xff0c;但是AI角色在受到一些物理碰撞或者惯性等原因&#xff0c;会发生旋转导致动画出现意料外的错误&#xff0c;比如在由动转静的时候&#xff0c;可能会发生向前翻转等一…

TP8/6 子域名绑定应用

原www.xxx.com/admin改为admincms.xxx.com config/app.php

【Linux】线程——线程的概念、线程的特点、线程的优点和缺点、线程和进程、线程函数的使用

文章目录 Linux线程1. 线程的概念1.1 什么是线程 2. 线程的特点2.1 线程的优点2.2 线程的缺点2.4 线程和进程 3. 线程函数的使用pthread_create() 创建线程pthread_self() 获取线程IDpthread_exit() 线程终止pthread_cancel() 线程取消pthread_join() 线程等待pthread_detach()…

Element-UI - el-table中自定义图片悬浮弹框 - 位置优化

该篇为前一篇“Element-UI - 解决el-table中图片悬浮被遮挡问题”的优化升级部分&#xff0c;解决当图片位于页面底部时&#xff0c;显示不全问题优化。 Vue.directive钩子函数已在上一篇中详细介绍&#xff0c;不清楚的朋友可以翻看上一篇&#xff0c; “Element-UI - 解决el-…

3.js - 色调映射(renderer.toneMapping)

// ts-nocheck// 引入three.js import * as THREE from three// 导入轨道控制器 import { OrbitControls } from three/examples/jsm/controls/OrbitControls// 导入lil.gui import { GUI } from three/examples/jsm/libs/lil-gui.module.min.js// 导入tween import * as TWEEN…

不同操作系统下的换行符

1. 关键字2. 换行符的比较3. ASCII码4. 修改换行符 4.1. VSCode 5. 参考文档 1. 关键字 CR LF CRLF 换行符 2. 换行符的比较 英文全称英文缩写中文含义转义字符ASCII码值操作系统Carriage ReturnCR回车\r13MacIntosh&#xff08;早期的Mac&#xff09;LinefeedLF换行/新行\…

Windows下载安装配置并使用Redis(保姆级教程)

文章目录 1、Redis的下载与安装 2、Redis的使用 3、Redis的图形界面客户端 4、Redis开机自启动 1、Redis的下载与安装 下载Redis&#xff1a;https://pan.baidu.com/s/1zBonkO2y6AZeqCdRe0W5ow?pwd9999 提取码: 9999 下载后直接解压就可以使用了 2、Redis的使用 我们…

全网最佳硕士研究生复试简历模板

硕士研究生复试简历模板 ✨ 简介 提供了一个适用于国内硕士研究生复试的个人简历模板。该模板通过统一的“样式”形成规范的Word格式&#xff0c;是目前研究生复试的最佳简历模板之一。模板使用“华文中宋”字体&#xff0c;如您的电脑中未安装此字体&#xff0c;请提前安装。…

软件测试与质量保证 | 云班课选择题库

目录 第1章课后习题 第2章课后习题 第3章课后习题 第4章课后习题 第5章课后习题 第6章课后习题 第7章课后习题 第8章课后习题 第9章课后习题 第10章课后习题 第11章课后习题 第12章课后习题 第13章 测试相关未分类习题 第1章课后习题 1. 与质量相关的概念包括 &a…

去中心化革命:探索区块链技术的前沿

随着信息技术的飞速发展&#xff0c;区块链技术作为一种新兴的去中心化解决方案&#xff0c;正逐渐改变着我们的经济、社会和技术格局。本文将从区块链的基本原理、当前的应用实例以及未来的发展趋势三个方面&#xff0c;深入探讨区块链技术在革命性变革中的角色和影响。 1. 区…

springboot 自定义的全局捕获异常失效

背景&#xff1a;springbootspringcloud 分布式微服务。 问题&#xff1a;公共模块在使用RestControllerAdvice全局捕获异常时&#xff0c;捕获不到子服务抛出的相应异常 首先看一下全局异常组件有么有被扫描到 如何查看&#xff0c;很简单只需要写一段类加载打印代码&#x…

【hot100】跟着小王一起刷leetcode -- 739. 每日温度

【hot100】跟着小王一起刷leetcode -- 739. 每日温度 739. 每日温度题目解读思路 代码总结 739. 每日温度 题目解读 739. 每日温度 老规矩&#xff0c;咱先看下题目。总结下来就是&#xff0c;你要返回一个answer数组&#xff0c;answer[i]中存储的应该是temperatures数组中…

Android跨进程通信,binder传输数据过大导致客户端APP,Crash,异常捕获,监听异常的数值临界值,提前Hook拦截。

文章目录 Android跨进程通信&#xff0c;binder传输数据过大导致Crash&#xff0c;异常捕获&#xff0c;监听异常的数值临界值&#xff0c;提前Hook拦截。1.binder在做跨进程传输时&#xff0c;最大可以携带多少数据1.1有时候这个1m的崩溃系统捕获不到异常&#xff0c; 2.监测异…

深度学习与飞桨 PaddlePaddle Fluid

编辑推荐 飞桨PaddlePaddle是百度推出的深度学习框架&#xff0c;不仅支撑了百度公司的很多业务和应用&#xff0c;而且随着其开源过程的推进&#xff0c;在其他行业得到普及和应用。 本书基于2019年7月4日发布的飞桨PaddlePaddle Fluid 1.5版本&#xff08;后续版本会兼容旧版…

[工业网络] 模型建立

普渡大学ICS参考模型 普渡企业参考架构&#xff08;PERA&#xff09;是由西奥多J威廉姆斯&#xff08;Theodore J. Williams&#xff09;和普渡大学计算机集成制造工业大学联盟的成员在1990年代开发的企业架构参考模型。该模型被ISA-99&#xff08;现为ISA/IEC 62443&#xff…

warning: LF will be replaced by CRLF the next time Git touches it warning

问题&#xff1a; warning: in the working copy of , LF will be replaced by CRLF the next time Git touches it warning: 今天上传git时报错&#xff0c;使用Ai&#xff1b;得知&#xff1b; 解决&#xff1a; 将 Git 配置为不自动转换换行符&#xff0c;使用以下命令…

snap和apt的区别简单了解

Linux中没有tree命令的时候提示安装的时候出现了两个命令&#xff0c;简单看了看两者有何区别&#xff08;一般用apt就可以了&#xff09;&#xff1a; sudo snap install tree 和 sudo apt install tree 这两个命令都是用来安装 tree 命令行工具的&#xff0c;但它们使用的是不…

webSocket网页通信---使用js模拟多页面实时通信

webSocket是什么 WebSocket是一种先进的网络技术&#xff0c;它提供了一种在单个TCP连接上进行全双工通信的能力。传统的基于HTTP的通信是单向的&#xff0c;即客户端发起请求&#xff0c;服务器响应请求&#xff0c;然后连接关闭。但是&#xff0c;WebSocket允许服务器和客户端…