前端生成PDF 文件教程+在线demo案例

本文探讨PDF格式的特性,解释其流行原因,并详细介绍了前端生成PDF的常见应用场景及难点。文章列举了三种前端生成PDF的方法,包括html2canvas+jsPdf、jsPDF和ActiveReportsJS,并分析了各自的优缺点。最后,给出了使用ActiveReportsJS生成PDF的示例代码,强调了正确处理字体资源的重要性。
摘要由CSDN通过智能技术生成

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈 

PDF 简介

PDF 全称Portable Document Format (PDF)(便携文档格式),该格式的显示与操作系统、分辨率、设备等因素没有关系,不论是在Windows,Unix还是在苹果公司的Mac OS操作系统中PDF格式都通用。Adobe公司在1993年为了文档传输创造了这个文件格式,这个格式使用PostScript页面描述语言,适用于列印图像和文字(无论是在纸、胶片或非物质的CRT都可)。PDF是基于页面描述语言。它既可以像程序代码一样具有可读性,又能表示出可任意放大和缩小的矢量图。

PDF文件格式可以将文字、字型、格式、颜色及独立于设备和分辨率的图形图像等封装在一个文件中,该格式文件还可以包含超文本链接、声音和动态影像等电子信息,支持特长文件,集成度和安全可靠性都较高。

为什么PDF 文件能够如此盛行

很多人所吐槽,说PDF 既不能编辑,也不好复制内容,更无法直接转换成Word,为什么要用PDF来传输资料呢?

殊不知,大家吐槽的缺点,正是因为它优点的过于强大而引起的。

PDF的产生之初的目的,是为了适应纸媒的印刷行业。PDF 原本并非为小屏幕电子阅读设计的文件标准,它来自于印刷——基于纸张大小进行的排版。我们可以把它当成纸质文稿的电子化,非电子文本,而是电子化的印刷了东西的纸张。它存在的目的是为了实现批量精准的印刷,保证在多个屏幕,多个系统,多终端中文件格式都能保存相对位置,展示布局都不会出现格式错乱,保证了打印到纸张上的格式完全一致,而不会内容格式面目而非。

试想,如果我们需要打印一份保险认购书,保险业务人员使用 iPad 打印的PDF 文件和使用PC 电脑打印出来的文件格式相差很大,页数不一致,换行不一致,那到底如何保证保险认购书的法律效应呢。 一份保单可以有多种格式,那就无法信任任何一份保单了。正如你面前有多个时钟,我们也就无法获取当前准确时间。

如果你实现过类似于打印页面,打印表单等功能,你可能会深有体会这其中的坑,吃过的苦只有自己清楚。

因为将网页保存为PDF 让用户预览或下载不失为一种保证格式在各终端一致的好方法。

除此之外,PDF 的优势除了跨平台,兼容性高,也 最大程度降低了查看成本 ,终端用户不需要安装一套沉重全功能的Adobe才能读到 PDF文件,只要客户机器上有浏览器就可以查看PDF内容。这也就是终端用户无论是手机端 iOS, Android,还是老的PC,新的PC机器都可以随时随地打开PDF 文件,支持阅读的方式非常多样便捷,而不是像Excel文件必须要office才能够读取。

再加上PDF 也可以进行小范围的编辑,安全属性的设置,如加密,加密打印等功能,实用性也是上升到另一个层次。

前端生成PDF 文件应用场景

随着移动互联网的发展,手机端增长需求暴增,互联网系统越多越多,新型系统都是为了更方便快捷解决用户而应用而生的,而用户需求也随着技术的发展悄然发生改变。

"全民皆网民"的阶段,再不是基本功能满足就可以站住脚的时代,用户体验及交互需求更加迫切,使得从机器时代的设计到人性化的设计,更加易用性。

前后端分离的技术架构畅行,让专业的人做专业的事情,开发更加高效畅通,因此在前端生成和展示PDF文件的需求也是比较普遍,我们总结一下PDF的常见应用场景:

  1. 项目中预览PDF 文件,并且提供搜索能力
  2. 手机端预览PDF 文件
  3. 用户填写表单,生成PDF 文件,用户直接下载保存
  4. 线上生成PDF 合同,打印

简单总结生成 PDF 的三类需求:

好的,以下是一个简单的示例代码,用于生成并打印 PDF 文件: ```java import java.io.FileOutputStream; import com.itextpdf.text.Document; import com.itextpdf.text.Paragraph; import com.itextpdf.text.pdf.PdfWriter; import java.awt.print.PrinterJob; import javax.print.PrintService; public class PDFGenerator { public static void main(String[] args) { try { // 创建文档对象 Document document = new Document(); // 设置输出路径 String outputPath = "C:/pdf/demo.pdf"; PdfWriter.getInstance(document, new FileOutputStream(outputPath)); // 打开文档对象 document.open(); // 添加段落 document.add(new Paragraph("Hello World!")); // 关闭文档对象 document.close(); // 输出提示信息 System.out.println("PDF文件生成并保存到:" + outputPath); // 打印PDF文件 printPDF(outputPath); } catch (Exception e) { e.printStackTrace(); } } // 打印PDF文件 public static void printPDF(String filePath) throws Exception { // 获取打印机服务 PrintService printService = PrinterJob.getPrinterJob().getPrintService(); // 创建打印任务 PrinterJob job = PrinterJob.getPrinterJob(); // 设置打印机 job.setPrintService(printService); // 设置打印文件 job.setPrintable(new PDFPrintable(filePath)); // 执行打印任务 job.print(); } } // PDF打印器 class PDFPrintable implements Printable { private PDDocument document; public PDFPrintable(String filePath) throws IOException { // 加载PDF文件 this.document = PDDocument.load(new File(filePath)); } @Override public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { // 获取PDF页码 int pageCount = document.getNumberOfPages(); if (pageIndex >= pageCount) { return NO_SUCH_PAGE; } // 获取PDF页面 PDPage page = document.getPage(pageIndex); // 创建Graphics2D对象 Graphics2D graphics2D = (Graphics2D) graphics; // 获取打印区域大小 Rectangle2D.Double rect = new Rectangle2D.Double( pageFormat.getImageableX(), pageFormat.getImageableY(), pageFormat.getImageableWidth(), pageFormat.getImageableHeight()); // 渲染PDF页面 PDFRenderer renderer = new PDFRenderer(page.getDocument()); BufferedImage image = renderer.renderImage(pageIndex, 1.0f); // 绘制PDF页面 graphics2D.drawImage(image, null, (int) rect.x, (int) rect.y); // 返回打印结果 return PAGE_EXISTS; } } ``` 这个示例使用了 iText 库来生成 PDF 文件,使用了 Java 的打印机 API 来打印 PDF 文件。示例中首先创建了一个文档对象,然后使用 PdfWriter 将其输出到指定的本地目录,接着添加了一个段落,最后关闭文档对象。示例中使用了字符串类型的 outputPath 变量来指定生成 PDF 文件的路径,你可以根据自己的需求修改该变量的值,指定生成 PDF 文件的具体路径。 当程序运行完成后,生成PDF 文件会自动保存到指定的本地目录中,并输出一条提示信息。接着,程序调用了 printPDF 方法,该方法使用了 Java 的打印机 API 来打印 PDF 文件。printPDF 方法中首先获取了系统中的打印机服务,然后创建了一个打印任务对象,设置了打印机和打印文件,最后调用了打印任务的 print 方法来执行打印任务。 注意,如果你要使用这个示例代码来打印 PDF 文件,你需要先在系统中安装一个 PDF 打印机服务,例如 Adobe PDF 或者 Foxit Reader PDF Printer 等,否则程序会抛出异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值