html导出PDF

该文介绍了一个将HTML页面转换为PDF的方法,涉及html2canvas.js和jspdf.umd.js库的使用。在PC端可以直接导出,但手机端需要后台中转。提供的示例代码展示了如何导出包含表格信息的PDF,并提供了转换和保存PDF的函数。

一、说明

一、流程
HTML页面 ---> 转换图片 ----> 转换PDF
二、引入js
前提需引入 html2canvas.js jspdf.umd.js
三、导出问题说明
PC端可以正常导出
手机端需要后台中转一下
四、依赖 html2canvas.js jspdf.umd.js

二、方法使用

/**
 * html转pdf
 * @param  elementId 需要输出PDF的页面id
 * @param successCallback 函数成功回调
 * @param errorCallback 函数失败回调
 * @returns {Object}
 *      pdf {Object} - 返回选定PDFjs类
 *      canvas { Object} - 返回canvas 类
 *      canvasUrl {String} - 返回可预览的base64
 */
exportHtmlPDF('pdf-box',(res)=>{
        const { canvasUrl,pdf,canvas} = res
        // // 导出PDF  pdf.save(`报名表${this.htmlFormatDate(new Date())}`)
        // // console.log(canvas.toDataURL("image/png")) // 图片预览地址
        // // var pdfData = pdf.output('datauristring')//获取到base64 的pdf
        this.pdf = pdf
        this.canvasUrl = canvasUrl
 })

三、示例

<div id="pdf-box" class="bg-gray-50">
    <h2 class="text-3xl font-bold pb-8 text-center">{{title}}</h2>
    <table class="table-border w-full">
        <colgroup>
            <col class="w-1/12">
            <col class="w-1/12">
            <col class="w-1/12">
            <col class="w-1/12">
            <col class="w-1/12">
            <col class="w-1/12">
            <col class="w-1/12">
            <col class="w-1/12">
            <col class="w-1/12">
            <col class="w-1/12">
            <col class="w-1/12">
            <col class="w-1/12">
        </colgroup>
        <tbody>
        <tr>
            <td colspan="2">姓名:</td>
            <td colspan="4">{{ pdfInfo.name }}</td>
            <td colspan="2">日期:</td>
            <td colspan="4">{{ pdfInfo.idCard }}</td>
        </tr>
        <tr>
            <td colspan="2">职务:</td>
            <td colspan="4">{{ pdfInfo.sex }}</td>
            <td colspan="2">部门:</td>
            <td colspan="4"  >{{ pdfInfo.education }}</td>
        </tr>
        <tr>
            <td colspan="1"  class="text-lg font-bold" >工作汇总</td>
            <td colspan="11" class="text-left" style="text-align: left;">{{ pdfInfo.major }}</td>
        </tr>
        <tr>
            <td :rowspan="pdfInfo.logList.length" class="text-lg font-bold">日志内容</td>
            <td colspan="2">{{ pdfInfo.logList[0].type }}</td>
            <td colspan="9">
                <p v-for="(log, index2) in pdfInfo.logList[0].records" :key="index2" style="text-align: left">{{ log }}</p>
            </td>
        </tr>
 
        <tr v-for="(item, index) in pdfInfo.logList.slice(1)" :key="index">
            <td colspan="2">{{ item.type }}</td>
            <td colspan="9">
                <p v-for="(log, index2) in item.records" :key="index2" style="text-align: left">{{ index2 + 1 }}、{{ log }}</p>
            </td>
        </tr>
 
 
        </tbody>
    </table>
</div>

四、js方法

// 引入 html2canvas.js
// 引入 jspdf.umd.js
 
/**
 * html转pdf
 * @param  elementId 需要输出PDF的页面id
 * @param successCallback 函数成功回调
 * @param errorCallback 函数失败回调
 * @returns {Object}
 *      pdf {Object} - 返回选定PDFjs类
 *      canvas { Object} - 返回canvas 类
 *      canvasUrl {String} - 返回可预览的base64
 */
 
/**
 * PDF 下载
 * pdf.save(`报名表${this.htmlFormatDate(new Date())}`)
 */
function exportHtmlPDF(elementId, successCallback,errorCallback){
    /**
     * 是否是函数
     * @returns {Boolean}
     */
    function htmlIsFunction(fun){
        if (Object.prototype.toString.call(fun) === "[object Function]") {
            return true
        } else {
            return false
        }
    }
    const element = document.getElementById(elementId)
    html2canvas(element, {
        scale: 1,
        backgroundColor: '#ffffff',
        allowTaint: true,
        useCORS: true,
        scrollY: 0,
        scrollX: 0
    }).then((canvas) => {
        const pdf = new jspdf.jsPDF("p", "mm", "a4") // A4纸,纵向
        // const pdf = new jspdf.jsPDF("l", "mm", "a4") // A4纸,横向
        const ctx = canvas.getContext("2d")
        const a4w = 190;
        const a4h = 257 // A4大小,210mm x 297mm,四边各保留20mm的边距
        const imgHeight = Math.floor(a4h * canvas.width / a4w) // 按A4显示比例换算一页图像的像素高度
        let renderedHeight = 0
        // this.canvasUrl = canvas.toDataURL("image/png")
        while (renderedHeight < canvas.height) {
            const page = document.createElement("canvas")
            page.width = canvas.width
            page.height = Math.min(imgHeight, canvas.height - renderedHeight) // 可能内容不足一页
 
            // 用getImageData剪裁指定区域,并画到前面创建的canvas对象中
            page.getContext("2d").putImageData(ctx.getImageData(0, renderedHeight, canvas.width, Math.min(imgHeight, canvas.height - renderedHeight)), 0, 0)
            pdf.addImage(page.toDataURL("image/jpeg", 1.0), "JPEG", 10, 10, a4w, Math.min(a4h, a4w * page.height / page.width)) // 添加图像到页面,保留10mm边距
 
            renderedHeight += imgHeight
            if (renderedHeight < canvas.height) { pdf.addPage() } // 如果后面还有内容,添加一个空页
            // delete page;
        }
        if (successCallback && htmlIsFunction(successCallback)) {
            successCallback({pdf,canvas,canvasUrl:canvas.toDataURL("image/png"),});
        }
        // pdf.save(title + time)
    }).catch((error)=>{
        if (errorCallback && htmlIsFunction(errorCallback)) {
            errorCallback(error);
        }
    });
}
### Java 使用 HTML 导出 PDF 的方法及库 #### 1. iText 库结合 Thymeleaf 或 FreeMarker 渲染 HTML 后转换成 PDF iText 是一个强大的用于创建和操作 PDF 文档的 Java 库。可以先通过模板引擎如 Thymeleaf 或者 FreeMarker 将数据填充到 HTML 模板中生成完整的 HTML 页面,再利用第三方工具将此页面转为 PDF 文件。 对于依赖管理,在 Maven 中添加如下配置来引入最新版本的 iText 和所选模板引擎: ```xml <dependencies> <!-- iText --> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext7-core</artifactId> <version>7.x.x</version> <!-- 查找最新的稳定版号替换此处 --> </dependency> <!-- 如果选用Thymeleaf作为模板引擎 --> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf</artifactId> <version>3.x.x</version> <!-- 查找最新的稳定版号替换此处 --> </dependency> <!-- 若选择FreeMarker则改为下面这行 --> <!--<dependency>--> <!-- <groupId>org.freemarker</groupId>--> <!-- <artifactId>freemarker</artifactId>--> <!-- <version>2.x.x</version> <!– 查找最新的稳定版号替换此处 –>--> <!--</dependency>--> </dependencies> ``` 完成上述设置之后就可以编写代码逻辑实现功能需求了[^3]。 #### 2. 使用 Flying Saucer (XHTMLRenderer) 直接解析 XHTMLPDF Flying Saucer 是另一个流行的开源项目,它能够直接读取符合标准的 XHTML 并将其渲染为高质量的 PDF 输出。这种方式不需要额外的数据绑定过程,适合于已经存在现成静态网页资源的情况。 Maven 配置如下所示: ```xml <dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>flying-saucer-pdf-itext5</artifactId> <version>9.1.20</version> </dependency> ``` 简单示例代码片段展示如何加载本地文件路径下的 html 进而保存 pdf: ```java import org.xhtmlrenderer.pdf.ITextRenderer; public class HtmlToPdfExample { public static void main(String[] args) throws Exception{ String url = "file:///path/to/your/input.html"; String outputFileName = "/path/to/output.pdf"; ITextRenderer renderer = new ITextRenderer(); renderer.setDocument(url); renderer.layout(); renderer.createPDF(outputFileName); System.out.println("成功导出PDF!"); } } ``` 以上两种方案各有优劣,具体取决于实际应用场景和个人偏好决定采用哪种方式[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值