使用javascript将HTML页面中的div下载为pdf

IT技术 javascript jquery
2021-01-19 01:24:46

我有一个 ID 为“内容”的内容 div。在内容 div 中,我有一些图表和一些表格。当用户单击下载按钮时,我想将该 div 下载为 pdf。有没有办法使用 javascript 或 jQuery 来做到这一点?

5个回答

你可以使用jsPDF

HTML:

<div id="content">
     <h3>Hello, this is a H3 tag</h3>

    <p>A paragraph</p>
</div>
<div id="editor"></div>
<button id="cmd">generate PDF</button>

JavaScript:

var doc = new jsPDF();
var specialElementHandlers = {
    '#editor': function (element, renderer) {
        return true;
    }
};

$('#cmd').click(function () {
    doc.fromHTML($('#content').html(), 15, 15, {
        'width': 170,
            'elementHandlers': specialElementHandlers
    });
    doc.save('sample-file.pdf');
});
这很好,只是可惜 css 没有被渲染:/
2021-03-22 01:24:46
jsPDF 也没有正确格式化表格,它只是将 td/th 解释为 display:block;
2021-03-24 01:24:46
我遇到了编码问题
2021-03-26 01:24:46
我这里有问题。我在这里添加的 css 没有应用到 pdf 文件中。我也有一些图表……那些没有出现在 pdf 中的图表。我该怎么做才能得到这些?
2021-03-31 01:24:46
使用上面的代码,我们只能创建一个 pdf 一次。但是第二次它不起作用。要使其工作,请查看@kristof-feys 的答案,我们需要doc在 click 函数中声明变量。
2021-04-06 01:24:46

<div class='html-content'>....</div>可以使用jspdfhtml2canvasa 中的内容下载为 pdf 样式

你需要参考两个js库,

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.min.js"></script>
<script type="text/javascript" src="https://html2canvas.hertzen.com/dist/html2canvas.js"></script>

然后调用下面的函数,

//Create PDf from HTML...
function CreatePDFfromHTML() {
    var HTML_Width = $(".html-content").width();
    var HTML_Height = $(".html-content").height();
    var top_left_margin = 15;
    var PDF_Width = HTML_Width + (top_left_margin * 2);
    var PDF_Height = (PDF_Width * 1.5) + (top_left_margin * 2);
    var canvas_image_width = HTML_Width;
    var canvas_image_height = HTML_Height;

    var totalPDFPages = Math.ceil(HTML_Height / PDF_Height) - 1;

    html2canvas($(".html-content")[0]).then(function (canvas) {
        var imgData = canvas.toDataURL("image/jpeg", 1.0);
        var pdf = new jsPDF('p', 'pt', [PDF_Width, PDF_Height]);
        pdf.addImage(imgData, 'JPG', top_left_margin, top_left_margin, canvas_image_width, canvas_image_height);
        for (var i = 1; i <= totalPDFPages; i++) { 
            pdf.addPage(PDF_Width, PDF_Height);
            pdf.addImage(imgData, 'JPG', top_left_margin, -(PDF_Height*i)+(top_left_margin*4),canvas_image_width,canvas_image_height);
        }
        pdf.save("Your_PDF_Name.pdf");
        $(".html-content").hide();
    });
}

参考:来自 html canvas 和 jspdf 的 pdf 生成

可能这会帮助某人。

如果一半的内容无法放在一页上,如何设置分页符?
2021-03-23 01:24:46
对我来说工作得很好。唯一的问题是我的一些 SVG 图标没有被渲染!
2021-03-25 01:24:46
这对我很有用,谢谢。它保留了所有样式,但确实有一些限制(将 PDF 创建为图像,因此不可搜索;似乎也有点模糊)。
2021-03-29 01:24:46
为此欠你几瓶啤酒。干杯! :)
2021-04-08 01:24:46

您的解决方案需要一些 ajax 方法将 html 传递到具有 html 到 pdf 工具的后端服务器,然后将生成的 pdf 输出返回到浏览器。

首先设置客户端代码,我们将设置jquery代码为

   var options = {
            "url": "/pdf/generate/convert_to_pdf.php",
            "data": "data=" + $("#content").html(),
            "type": "post",
        }
   $.ajax(options)

然后从 html2pdf 生成脚本(来自互联网的某个地方)截取数据。
convert_to_pdf.php(在 JQUERY 代码中作为 url 给出)看起来像这样 -

<?php
    $html = $_POST['data'];
    $pdf = html2pdf($html);
    
    header("Content-Type: application/pdf"); //check this is the proper header for pdf
    header("Content-Disposition: attachment; filename='some.pdf';");
    echo $pdf;
?>
可以引用相同的 url 还是我应该更改它?
2021-03-30 01:24:46
那个网址应该如何?你能给我举个例子吗??
2021-03-30 01:24:46
如果 CSS 被链接,你会被搞砸,因为你的后端程序不知道在哪里找到样式,除非它可以获取 CSS 文件并从文件中应用样式。
2021-04-02 01:24:46
您需要一个略有不同的网址,以便您可以区分这两个内容
2021-04-07 01:24:46
你所说的“有一个 htmltopdf 工具”是什么意思??
2021-04-08 01:24:46

AFAIK 没有执行此操作的本机 jquery 函数。最好的选择是在服务器上处理转换。您如何执行此操作取决于您使用的语言(.net、php 等)。您可以将 div 的内容传递给处理转换的函数,该函数将向用户返回 pdf。

是的,可以在 JS 中将 div 捕获为 PDF。您可以查看https://grabz.it提供的解决方案它们有漂亮而干净的 JavaScript API,可以让您捕获单个 HTML 元素(例如 div 或 span)的内容。

所以,你使用它你将需要app+key和免费的SDK它的用法如下:

假设您有一个 HTML:

<div id="features">
    <h4>Acme Camera</h4>
    <label>Price</label>$399<br />
    <label>Rating</label>4.5 out of 5
</div>
<p>Cras ut velit sed purus porttitor aliquam. Nulla tristique magna ac libero tempor, ac vestibulum felisvulput ate. Nam ut velit eget
risus porttitor tristique at ac diam. Sed nisi risus, rutrum a metus suscipit, euismod tristique nulla. Etiam venenatis rutrum risus at
blandit. In hac habitasse platea dictumst. Suspendisse potenti. Phasellus eget vehicula felis.</p>

要捕获功能 ID 下的内容,您需要:

//add the sdk
<script type="text/javascript" src="grabzit.min.js"></script>
<script type="text/javascript">
//login with your key and secret. 
GrabzIt("KEY", "SECRET").ConvertURL("http://www.example.com/my-page.html",
{"target": "#features", "format": "pdf"}).Create();
</script>

您需要将 替换为http://www.example.com/my-page.html您的目标网址和#feature您的 CSS 选择器。

就这样。现在,当页面加载时,现在将在与脚本标记相同的位置创建一个图像截图,它将包含功能 div 的所有内容,没有其他内容。

您可以对 div-screenshot 机制进行其他配置和自定义,请在此处查看

我认为使用grabz.it 只能获得1,000 次免费捕获和100 次免费“抓取”。因此,除非您愿意为此付费,否则这不是永久解决方案。
2021-04-03 01:24:46