当前位置: 首页 > news >正文

【基于rust-wasm的前端页面转pdf组件和示例】

基于rust-wasm前端页面转pdf组件和示例

  • 多余的废话
  • 花哨的吹牛
  • 那点东西
  • 要不要拿来试试
  • 朔源

我觉得本文的意义在于,wasm扩展了浏览器的边界,但是又担心如同java的web applet水土不服.

如同我至今看不出塞班和iOS的不同

多余的废话

本文大致基于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>

效果图
在这里插入图片描述

朔源

https://blog.csdn.net/wjcroom/article/details/144171274
【Rust在WASM中实现pdf文件的生成】基于此文,对代码进行了精简,且引入了github,printpdf,0.7以后的开发版,用来解决png,在a通道情况下的失效问题,本文将对代码特点和使用集成做一个 说明.


http://www.mrgr.cn/news/81278.html

相关文章:

  • 数据结构-c++
  • 模型优化之知识蒸馏
  • 使用Excel制作通达信自定义外部数据,安排!!!
  • C语言(一)——初识C语言
  • 精准提升:从94.5%到99.4%——目标检测调优全纪录
  • QT笔记- QClipboard剪切板对QByteArray数据的复制与粘贴
  • 蓝牙协议——音量控制
  • Django 管理命令中使用 `logging` 和 输出样式
  • 只谈C++11新特性 - 显式虚函数重写
  • docker 安装minio
  • es 中使用update 、create 、index的区别
  • MQTT协议在树莓派上的安全性和性能测试及其在物联网应用中的应用
  • Dubbo 3.x源码(28)—Dubbo服务发布导出源码(7)应用级服务接口元数据发布
  • 物理层知识要点
  • 论如何优雅地“扒“C代码的底裤 - 白盒审计笔记
  • JWT的生成和工作原理
  • 跟踪方案和小语法
  • leetcode 面试经典 150 题:螺旋矩阵
  • ffmpeg之显示一个yuv照片
  • 对称二叉树
  • ffmpeg之播放一个yuv视频
  • 连续自成核退火热分级(SSA)技术表征共聚聚丙烯(PP)分子链结构
  • pytorch MoE(专家混合网络)的简单实现。
  • 国内RPA产品对比
  • 【笔记】学校教的SSH:远程连接到另一个电脑 并对其进行操作
  • 3D视觉坐标变换(像素坐标转换得到基于相机坐标系的坐标)