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


90

我有一个内容div,其ID为“ content”。在内容div中,我有一些图形和一些表。当用户单击下载按钮时,我想以pdf格式下载该div。有没有办法使用javascript或jQuery?


1
我知道code.google.com/p/jspdf是最好的库,可以做到这一点。
AlvinArulselvan 2013年

如何使用jsPDF在特定div中下载内容?从我在他们网站的示例中看到的结果来看,这是无法完成的。
Midhun Mathew

Answers:


111

您可以使用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');
});

25
我在这里有问题。我在此处添加的css并未在pdf文件中应用。我也有一些图表..那些r不在pdf中。我应该怎么做才能得到那些?
Midhun Mathew

14
jsPDF也不正确格式化表格,它只是将td / th解释为display:block;
戴夫

2
使用以上代码,我们只能创建一次pdf。但是第二次它不起作用。要使其正常运行,请通过@ kristof-feys检查此答案,我们需要doc在click函数中声明变量。
Mahendran Sakkarai 2014年

4
很好,只是没有显示CSS的遗憾:/
Nicholas

1
我遇到了编码问题
ema(

18

里面的内容<div class='html-content'>....</div>可以使用样式下载为pdf文件 jspdfhtml2canvas

您需要同时引用这两个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画布和jspdf的pdf生成

也许这会帮助某人。


3
谢谢,这对我来说很棒。它保留了所有样式,但确实有一些局限性(将PDF创建为图像,因此无法搜索;似乎也有些模糊)。
jramm

如果一半内容不能放在一页上,如何设置分页符?
谢赫·谢特

对我来说很好。唯一的问题是我的某些SVG图标未呈现!
Felipe N Moura

2

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

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

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

然后按如下所示拦截来自html2pdf生成脚本的数据

   $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;

 


您所说的“具有htmltopdf工具”是什么意思?
Midhun Mathew

是否可以引用相同的URL还是应该更改它?
Midhun Mathew 2013年

您将需要一个稍微不同的URL,以便您可以区分这两个内容
DevZer0 2013年

该网址应如何?你能给我举个例子吗??
Midhun Mathew 2013年

2
但是,如果链接了CSS,您将不知所措,因为除非您的后端程序可以抓取CSS文件并从文件中应用样式,否则它将不知道在哪里找到样式。
TheRealChx101 '16

1

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


-1

是的,可以在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屏幕截图机制执行的其他配置和自定义操作,请在此处查看


2
我认为您可以通过grabz.it免费获得1000次免费捕获和100次免费“抓取”。因此,除非您愿意为此付费,否则这不是一个永久性的解决方案。
BrettC
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.