【基于rust-wasm的前端页面转pdf组件和示例】
基于rust-wasm前端页面转pdf组件和示例
- 朔源
- 多余的废话
- 花哨的吹牛
- 那点东西
- 要不要拿来试试
- 事到如今 做个美梦
我觉得本文的意义在于,wasm扩展了浏览器的边界,但是又担心如同java的web applet水土不服.
如同我至今看不出塞班和iOS的不同
下载地址:在github的备份
朔源
【Rust在WASM中实现pdf文件的生成】
基于此文,对代码进行了精简,且引入了github,printpdf,0.7以后的开发版,用来解决png在α通道情况下的空白问题,本文将对代码特点和使用集成做一个 说明.
多余的废话
本文大致基于2024年最新的技术,rust,trunk,printpdf展示了一个纯传统的功能, web页面转pdf.虽然是png做中间商,差强人意.
在n年前,.net环境,我使用的不熟,还是用wkhtml2pdf这个二进制工具,强行console命令转出页面.格式. 到了现在, vue生成的页面再去转有些变形.后来发现html5的canvos在渲染后可以截屏,很方便,基于这个原理,发现一个项目,domtoimage,已经停止维护3,4年了.在它的帮助下,借由python后台,实现了一款,能用的.
现在相同的功能也在rust的帮助下在wasm中实现了.
编程语言这东西没好的坏的,解决的实际问题,才是一个语言最终的归宿.现实就是不停的出现问题,然后用各种方法去解决它.
花哨的吹牛
wasm相对于后端pdf生成的优势:
- 不占带宽和服务器资源
- 兼容多数现代浏览器
- 后端技术可以更灵活
缺点不方便维护,开发难度有点高,相同的功能,明显有其他可选的方案,生成的文件挺大的8M了.
本wasm生成Pdf的特点:
- 使用A4布局
- 会自动等比例扩展到全屏
- 自动高宽旋转,适应页面布局
html的优势 - 纯静态页面,html环境使用
- 也可在vue,react,任意前端集成,通过html跳转,或直接写成可引用的模块.
那点东西
本文的release是纯前端的代码,html+wasm完成png到pdf转换,含有三个文件html,js,wasm.其中html是调用入口,
使用流程如下
- 调用页面将png的dataurl,存入localStorage,然后window.open转向topdf1.2.html
- 在topdf1.2.html里加载wasm成功后调用show()函数,在iframe中显示.
其中topdf1.2.html里我这样显示pdf
function showpdf()
{let blobpdf=wasmBindings.png2pdf()let fn=localStorage.getItem('pdfname')+'.pdf'document.getElementById('theifm').src=blobpdflet link= document.getElementById('downlink')link.href= blobpdflet arr=fn.split('/')fn =arr[arr.length-1]link.download=fnlink.text=fn+"下载"// link.click()}
trunk这样初始化wasm
<script type="module" nonce="u5yI1HDYG90lcDoY328TfQ==">
import init, * as bindings from '/trunk-hello-world-349f5610c9c8b33b.js';
const wasm = await init({ module_or_path: '/trunk-hello-world-349f5610c9c8b33b_bg.wasm' });window.wasmBindings = bindings;showpdf();dispatchEvent(new CustomEvent("TrunkApplicationStarted", {detail: {wasm}}));</script>
要不要拿来试试
借助domtoimage和wasm将现有页面转换pdf的演示:
topdexample.html
<!DOCTYPE html>
<html><style>#main {padding-top: 20px; padding-bottom: 10px; /* Required padding for .navbar-fixed-top */}</style><head><script type="text/javascript" src="/js/jquery.min.js"></script><script type="text/javascript" src="/js/dom-to-image.min.js"></script><script type="text/javascript" charset="utf-8">$().ready(()=>{var node=$("#main") for (var i = 0; i < 30; i++) {// 创建一个新的<p>元素并插入当前文本node.append('<p>第' + i + '段文本</p>');
}domtoimage.toPng(node[0]).then(async function (dataUrl) {window.open(dataUrl,"_blank");localStorage.setItem('imageDataURL', dataUrl);localStorage.setItem('pdfname', '当前模板');window.open('/topdf1.2.html',"_blank");});}); </script>
</head>
<body>
<div id="main" align='center' > </div>
</html>
效果图

事到如今 做个美梦
其实要是拿塞班聊天上网刷抖音也还行.
就如同今天拿wasm来写出一个pdf文件.
展望未来,wasm可能使浏览器,更具有AI小模型功能.在本地就能提供很⏲的,瞬时的拼写错误提醒,比方我说美化排版,查找错误.wasm可以瞬时完成.然后呢?
它不会泄露隐私,可以只存放于本地.还能使用很多加密方式.网络协议方式. 就像我不知道的ios一样吧.
相关文章:
【基于rust-wasm的前端页面转pdf组件和示例】
基于rust-wasm前端页面转pdf组件和示例 朔源多余的废话花哨的吹牛那点东西要不要拿来试试事到如今 做个美梦 我觉得本文的意义在于,wasm扩展了浏览器的边界,但是又担心如同java的web applet水土不服. 如同我至今看不出塞班和iOS的不同下载地址:在github的备份 朔源…...
ARM64 Windows 10 IoT工控主板运行x86程序效率测试
ARM上的 Windows 10 IoT 企业版支持仿真 x86 应用程序,而 ARM上的 Windows 11 IoT 企业版则支持仿真 x86 和 x64 应用程序。英创推出的名片尺寸ARM64工控主板ESM8400,可预装正版Windows 10 IoT企业版操作系统,x86程序可无需修改而直接在ESM84…...
开放世界目标检测 Grounding DINO
开放世界目标检测 Grounding DINO flyfish Grounding DINO 是一种开创性的开放集对象检测器,它通过结合基于Transformer的检测器DINO与基于文本描述的预训练技术,实现了可以根据人类输入(如类别名称或指代表达)检测任意对象的功…...
easegen将教材批量生成可控ppt课件方案设计
之前客户提出过一个需求,就是希望可以将一本教材,快速的转换为教学ppt,虽然通过人工程序脚本的方式,已经实现了该功能,但是因为没有做到通用,每次都需要修改脚本,无法让客户自行完成所有流程&am…...
2002 - Can‘t connect to server on ‘192.168.1.XX‘ (36)
参考:2002 - Can‘t connect to server on ‘192.168.1.XX‘ (36) ubantu20.04,mysql5.7.13 navicat 远程连接数据库报错 2002 - Can’t connect to server on ‘192.168.1.61’ (36) 一、查看数据库服务是否有启动,发现有启动 systemctl status mysql…...
【虚拟机网络拓扑记录】
虚拟机网络拓扑记录 虚拟机安装windows到ubuntu的网络拓扑ubuntu到ubuntu里面的虚拟机网络拓扑windows到ubuntu里面的虚拟机网络拓扑 虚拟机安装 本实验宿主机为windos, 安装vmware,虚拟机操作系统使用ubuntu,然后再在ubuntu上面创建新的虚拟…...
【单片机通讯协议】—— 常用的UART/I2C/SPI等通讯协议的基本原理与时序分析
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、通信基本知识1.1 MCU的参见外设1.2 通信的分类按基本的类型从传输方向上来分 二、UART(串口通讯)2.1 简介2.2 时序图分析2.3 UART的…...
Vue3 核心语法
1. OptionsAPI 与 CompositionAPI Vue2 的API设计是 Options(配置)风格的。Vue3 的API设计是 Composition(组合)风格的。 1.1 Options API 的弊端 Options类型的 API,数据、方法、计算属性等,是分散在&a…...
LLaMA-Factory GLM4-9B-CHAT LoRA 指令微调实战
🤩LLaMA-Factory GLM LoRA 微调 安装llama-factory包 git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git进入下载好的llama-factory,安装依赖包 cd LLaMA-Factory pip install -e ".[torch,metrics]" #上面这步操作会完成…...
GTM023 W.H.Greub线性代数经典教材:Linear Algebra
这本教材是我高中时期入门线性代数的主要教材,我的很多基础知识都来源于这本书,如今看回这本书可以说满满的回忆。这本书可以说,是我读过的内容最为全面且完备的线性代数教材了。而且它的语言风格非常的代数化,没有什么直观可言&a…...
交换机与路由器的区别
交换机和路由器是网络中的两种关键设备,它们各自承担不同的功能,主要区别体现在以下几个方面: 一、工作层次与功能 交换机: 工作层次:交换机主要工作在OSI模型的第二层,即数据链路层。 功能:交…...
springboot502基于WEB的牙科诊所管理系统(论文+源码)_kaic
牙科诊所管理系统的设计与实现 摘要 近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定牙科诊所管理系统的…...
soular使用教程
用 soular 配置你的组织,工作更高效!以下是快速上手的简单步骤:  1. 账号管理 可以对账号信息进行多方面管理,包括分配不同的部门、用户组等,从而确保账号权限和职责的清晰分配。  1.1 用…...
纯div+css+js弹出窗
目的:实现弹出窗、仅关闭弹窗之后才能操作。自适应宽度与高度、当文本内容太多时、添加滚动条效果。 效果图 源码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport"…...
一篇文章学会HTML
目录 页面结构 网页基本标签 图像标签 超链接标签 文本链接 图像链接 锚链接 功能链接 列表 有序列表 无序列表 自定义列表 表格 跨列/跨行 表头 媒体元素 视频 音频 网站的嵌套 表单 表单元素 文本框 单选框 多选框 按钮 下拉框 文本域和文件域 表…...
QGIS二次开发(插件开发)
实习二 QGIS插件开发 2.1 任务要求 a)用C语言编写qgis插件,实现带有x/y坐标的文本文件的地图显示。 用文件流fstream操作文本文件,读取其中的坐标数据。基于QgsPlugin相关类派生出一个插件,并加到插件工厂中。基于QgsVectorLaye…...
Web防火墙和下一代防火墙的区别
介绍 客户经常询问“当我已经拥有下一代防火墙(NGFW)时,为什么需要Web应用程序防火墙(WAF)?”。本博文的目的是解释两种解决方案之间的区别,重点关注Web应用程序防火墙可以提供的附加值。 什么…...
Linux:alias别名永久有效
一、背景 日常使用bash时候,有些常用的命令参数的组合命令太长,很难记,此时可以利用Linux提供的alias命令生成命令的别名(命令的隐射),但是我们会发现,当退出了终端后重新登录就失效了ÿ…...
【递归与回溯深度解析:经典题解精讲(中篇)】—— LeetCode
文章目录 组合目标和组合总和字母大小写全排序优美的排列N皇后 组合 思路:回溯算法 问题要求从 1 到 n 中选出 k 个数的所有组合。 使用回溯算法递归构造解。 每次递归时,记录当前的组合路径,当组合长度达到 k 时,将其加入结果集…...
01.HTTPS的实现原理-HTTPS的概念
01.HTTPS的实现原理-HTTPS的概念 简介1. HTTPS的概念和安全性2. HTTPS的实现原理3. HTTPS和HTTP的区别4. OSI七层协议模型5. SSL和TLS的区别 简介 该系列文章主要讲述了HTTPS协议与HTTP协议的区别,以及HTTPS如何实现安全传输。内容分为三部分:HTTPS的实…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法
深入浅出:JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中,随机数的生成看似简单,却隐藏着许多玄机。无论是生成密码、加密密钥,还是创建安全令牌,随机数的质量直接关系到系统的安全性。Jav…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
Unity | AmplifyShaderEditor插件基础(第七集:平面波动shader)
目录 一、👋🏻前言 二、😈sinx波动的基本原理 三、😈波动起来 1.sinx节点介绍 2.vertexPosition 3.集成Vector3 a.节点Append b.连起来 4.波动起来 a.波动的原理 b.时间节点 c.sinx的处理 四、🌊波动优化…...
android13 app的触摸问题定位分析流程
一、知识点 一般来说,触摸问题都是app层面出问题,我们可以在ViewRootImpl.java添加log的方式定位;如果是touchableRegion的计算问题,就会相对比较麻烦了,需要通过adb shell dumpsys input > input.log指令,且通过打印堆栈的方式,逐步定位问题,并找到修改方案。 问题…...
通过MicroSip配置自己的freeswitch服务器进行调试记录
之前用docker安装的freeswitch的,启动是正常的, 但用下面的Microsip连接不上 主要原因有可能一下几个 1、通过下面命令可以看 [rootlocalhost default]# docker exec -it freeswitch fs_cli -x "sofia status profile internal"Name …...
SpringAI实战:ChatModel智能对话全解
一、引言:Spring AI 与 Chat Model 的核心价值 🚀 在 Java 生态中集成大模型能力,Spring AI 提供了高效的解决方案 🤖。其中 Chat Model 作为核心交互组件,通过标准化接口简化了与大语言模型(LLM࿰…...
