JS转PDF

简介:

前端时间调研了一下js转pdf的一些方案,做个整理。

一开始考虑前端转还是后端转,后来想想前端可能做出来和看到的会更像一点,所以先考虑前端的方案。
首先通过google和ata等搜到jsPDF这个库,不过一开始看到例子都不是把html转成pdf。

后来看了它的一些文档,里面有个fromHTML方法,不过它不支持utf8,其github上有个issue,就我看到了有这几个workaround:

  1. pdfkit
  2. pdfmake
  3. jsPDF的插件addHTML

1和2看上去比较复杂,而且也没找到明确的从HTML转pdf的方法,所以直接尝试方案三,不过有兴趣也可以研究一下。查看了addHTML的文档和代码后,写了下面这个js:

var pdf = new jsPDF('p','pt','a4');
var element = $("body");
element = document.getElementsByClassName("span12")[0];//element.find('.span12');
console.log(element);
  pdf.addHTML(element,{
    format: 'png',
    pagesplit: true,
    rstz: true
  },function() {
  var string = pdf.output('datauristring');
  pdf.save("abc.pdf");
       $('.preview-pane').attr('src', string);
 });

看上去它的原理就是先把当前页面通过html2canvas或者rasterizeHTML库转成图片,然后调用jsPDF的addimage来生成pdf。上述代码中rstz就是控制用html2canvas还是rasterizeHTML。 不过它主要问题是不会自动分页,要自动分页的话要加上pagesplit这个选项,但是会失真。

下面贴一些效果图:

### html2canvas + No pagesplit
9778de4caaa35bf3.png

### html2canvas + pagesplit
e62a188566912852.png

### rasterizeHTML + No pagesplit

1b71f19119d29065.png

### rasterizeHTML + pagesplit
2dc426b3cdb37973.png

可以看到html2canvas在分页时候会失真,rasterizeHTML表现良好。

不过在做我们这个demo的时候,我发现rasterizeHTML对那些复杂一点的css支持不是太友好,而且装起来也比较复杂,所以最后还是用了html2canvas。然后尝试绕过分页的bug, 最后通过多次调用addHTML来避免问题。代码如下:

var pdf = new jsPDF('p', 'pt', 'a4');
var header = document.getElementsByTagName('header')[0];
var options = { format: 'png' };
var ready = false;

var sections = [
 document.getElementById('main-result'),
 document.getElementById('deep-result'),
 document.getElementById('other-result')
];

var cy = 120;

function makePDF(eles) {
 pdf.addHTML(header, 0, 0, options,
   function () {
     addPage(eles);
   });
}

function addPage(eles) {
 if (!eles || eles.length <= 0) {
   ready = true;
   return;
 }
 var ele = eles[0];
 pdf.addHTML(ele, 0, cy, options,
   function () {
     cy = 0;
     if (eles.length > 1) {
       pdf.addPage();
     }
     addPage(eles.slice(1));
   });
}

makePDF(sections);

$('#onDownload').click(function () {
 if (ready) {
   pdf.save('def.pdf');
 }
});

理论上我感觉通过查看它本身addhtml的源码是能解决分页问题的,不过由于时间和能力关系我还没法解决。如果有能解决的欢迎告诉我。

另外网上有个类似的方案也可以参考一下.

对于后端生成pdf, 理论上也是可行的,比如这里这里 不过看上去都很复杂,不如前端生成的简单。

还有就是通过phantomjs, 因为时间关系也没好好研究。

目录
相关文章
|
存储 JSON JavaScript
【2023-08-20】最新PDF.js PDF批注注释插件库:创建、保存和管理PDF注释批注(高亮、文本框、绘图、截屏、历史记录、橡皮檫)-pdf.js
探索基于pdf.js-dist开发的纯Javascript PDF批注插件库,支持保存、导出、导入和管理PDF文件中的批注。多个功能模块为您提供丰富的PDF注释体验。
574 0
【2023-08-20】最新PDF.js PDF批注注释插件库:创建、保存和管理PDF注释批注(高亮、文本框、绘图、截屏、历史记录、橡皮檫)-pdf.js
|
1月前
|
数据采集 Web App开发 JavaScript
Puppeteer自动化:使用JavaScript定制PDF下载
在现代Web开发中,自动化工具如Puppeteer可显著提升效率并减少重复工作。Puppeteer是一款强大的Node.js库,能够控制无头Chrome或Chromium浏览器,适用于网页快照生成、数据抓取及自动化测试等任务。本文通过示例展示了如何使用Puppeteer自动化生成定制化的PDF文件,并介绍了如何通过配置代理IP、设置user-agent和cookie等技术增强自动化过程的灵活性与稳定性。具体步骤包括安装Puppeteer、配置代理IP、设置user-agent和cookie等,最终生成符合需求的PDF文件。此技术可应用于报表生成、发票打印等多种场景。
Puppeteer自动化:使用JavaScript定制PDF下载
|
4月前
|
JavaScript 前端开发 程序员
《JavaScript权威指南第7版》中文PDF+英文PDF+源代码 +JavaScript权威指南(第6版)(附源码)PDF下载阅读分享推荐
JavaScript是Web标准语言,广泛应用于各类浏览器,造就了其最广泛部署的地位。Node.js的兴起扩展了JavaScript的使用场景,使其成为开发者首选语言。无论新手还是经验丰富的程序员,都能受益于学习JavaScript。[《JavaScript权威指南第7版》资源链接](https://zhangfeidezhu.com/?p=224)
254 5
《JavaScript权威指南第7版》中文PDF+英文PDF+源代码 +JavaScript权威指南(第6版)(附源码)PDF下载阅读分享推荐
|
6月前
|
JSON 前端开发 JavaScript
【2024-04-22 源码】最新PDF批注注释插件库,pdf.js插件库,纯前端离线JavaScript库(PDF高亮、下划线、橡皮擦、文本框、画笔、历史记录)
一款基于 pdf.js 开发的PDF批注插件库,支持纯离线内网部署,功能完善、强大且在不断升级,极易上手,欢迎关注!
192 4
【2024-04-22 源码】最新PDF批注注释插件库,pdf.js插件库,纯前端离线JavaScript库(PDF高亮、下划线、橡皮擦、文本框、画笔、历史记录)
|
6月前
|
JSON JavaScript 前端开发
vue项目使用Print.js插件实现PDF文件打印
vue项目使用Print.js插件实现PDF文件打印
502 0
|
6月前
|
移动开发 JavaScript
echarts生成图表并下载为PDF文件(附带js源码地址)
echarts生成图表并下载为PDF文件(附带js源码地址)
131 0
|
12月前
|
JavaScript 前端开发 安全
|
JSON JavaScript 前端开发
【2023-11-01】一款基于 pdf.js 的 PDF 批注注释插件库(纯JS、高亮、画笔、多边形、历史记录)
基于纯 JavaScript 和 PDF.js 做的一款 PDF 批注拓展插件-PDFMaster,一款仍能兼容支持IE 11的PDF批注插件,界面美观功能强大,有无开发经验都可以快速简单快速使用。
305 0
【2023-11-01】一款基于 pdf.js 的 PDF 批注注释插件库(纯JS、高亮、画笔、多边形、历史记录)
|
Web App开发 JavaScript 安全
利用pdf.js在线展示PDF文档
利用pdf.js在线展示PDF文档
396 0
下一篇
无影云桌面