在现代web应用程序、商业报告和其他文档生成应用程序中,将网页内容转换为PDF格式是一个常见的需求。传统的做法是使用类似于Adobe Acrobat等PDF生成库,并且这些库大多数只适用于后端。 但是,随着前端web技术的发展,现在可以使用JavaScript或TypeScript在浏览器中直接生成PDF文件。这种方法有很多优点,如避免服务器负载,并且使得PDF生成的过程变得更加灵活。
一、前端生成PDF下载
有时候,用户需要下载由前端生成的PDF文件。这是可以通过使用Blob和URL.createObjectURL()方法实现的。通过将一个Blob对象直接放在URL上,可以在客户端上直接生成下载链接。以下是实现的代码示例:
const pdfBlob = new Blob([pdfData], { type: 'application/pdf' }); const pdfUrl = URL.createObjectURL(pdfBlob); const link = document.createElement('a'); link.href = pdfUrl; link.download = "example.pdf"; document.body.appendChild(link); link.click();
在获得链接之后,我们还需要创建一个a元素,将其设置为下载链接,并且通过模拟点击标签来强制浏览器开始下载PDF。
二、前端生成PDF功能
前端生成PDF功能是通过将HTML内容转换为PDF实现的,这可以通过许多JavaScript PDF库来完成。其中最受欢迎的是jsPDF、pdfmake、html2pdf以及wkhtmltopdf。以上的PDF生成器都可用于前端实现HTML到PDF的转换。jsPDF是一个开源库,可以生成HTML5 JavaScript应用程序。通过jsPDF,开发人员可以通过使用JavaScript规范简单地创建和保存PDF文件。
const doc = new jsPDF(); doc.text("Hello World", 10, 10); doc.save("example.pdf");
以上代码中,我们创建了一个空的PDF文档,然后在其上添加一些文本。最后通过调用save()方法来保存该文档。如果您需要将一个现有的HTML文档转换为PDF,则可以使用
html2canvas(document.body).then(canvas => { const imgData = canvas.toDataURL('image/png'); const pdf = new jsPDF(); pdf.addImage(imgData, 'PNG', 0, 0); pdf.save("example.pdf"); });
通过html2canvas,我们可以生成整个HTML页面的截图,将其转换为PNG图像,并将其添加到新创建的PDF文档中。
三、前端生成PDF可复制
前端生成的PDF文件通常不能够复制其中的文本和内容。这是因为通常生成的PDF是扫描PDF,每一页上的文本是一个图片而不是真正的文本。要解决这个问题,我们可以使用一种新的PDF生成方法,即使用HTML/CSS作为源,在客户端上生成PDF文件。
这种方法生成的PDF是真正的PDF文件,而非扫描文件。这些PDF文件可以完全被选择、复制和粘贴,此外还可以搜索其中的内容。实现这种PDF生成方案的库包括:PDFKit、Puppeteer和wkhtmltopdf。
const puppeteer = require('puppeteer'); (async () => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('http://example.com'); const pdf = await page.pdf({ format: 'A4' }); await browser.close(); return pdf; })();
以上代码可以在客户端上使用Puppeteer来生成一个真正的PDF文件。Puppeteer是一个完全支持Chrome/Chromium API的库,它可以通过JavaScript来控制浏览器,这样就可以生成非常完美的PDF文件。
四、前端生成PDF文件
虽然前端生成PDF的主要目的是在浏览器中生成文件,但是通过使用Node.js、Express或其他web框架,也可以在后台生成PDF文件。例如,通过使用
const pdf = require('html-pdf'); const fs = require('fs'); const html = fs.readFileSync('./template.html', 'utf8'); pdf.create(html).toFile('./output.pdf', (err, res) => { if (err) return console.log(err); console.log(res); });
在上面的示例中,我们首先将HTML模板读入到内存中,然后将其作为参数传递给html-pdf库的create()方法。最后,我们将PDF文件保存在硬盘上。
五、前端生成PDF方案
生成PDF的方案取决于要求。有些要求是非常简单的,只需要在浏览器中生成一个PDF文件就可以了,而有些方案可能需要在复杂的应用程序中生成PDF文件。下面是一些客户端和服务端生成PDF的适用场景:
- 对于简单的网站页面,可以使用PDFKit或jsPDF。
- 对于复制和粘贴功能,可以使用Puppeteer或wkhtmltopdf。
- 当需要在后台自动化PDF生成过程时,可以使用html-pdf。
- 对于更大规模的应用程序,可以使用pdfmake。
六、前端生成PDF文件浏览
有时候,我们不想下载PDF文件,而是想在浏览器中直接查看。可以使用PDF.js库,它是一个基于HTML5技术的PDF查看器。
const pdfUrl = 'example.pdf'; const pdfDoc = null; PDFJS.getDocument(pdfUrl) .then(doc => { pdfDoc = doc; const numPages = doc.numPages; console.log(numPages); });
PDF.js通过HTTP请求获取PDF文件,并将其作为多页PDF文档进行解析。一旦文档被解析,查看器就可以在HTML5 canvas元素上呈现每一页。
七、前端生成PDF并下载
Pdfgenerator是一个非常灵活的库,可以在Node.js中或者浏览器中使用。该库支持多种格式和格式化选项,支持复杂文档创建和样式设置。以下是一个在浏览器中使用Pdfgenerator生成PDF文件并下载的示例代码:
const pdfgen = require('pdfgenerator'); const html = 'Hello World