如何正确使用jsPDF库

105

我希望将一些div转换成PDF,我尝试过jsPDF库,但没有成功。似乎我无法理解需要导入哪些内容才能让库正常工作。我已经研究了示例,但还是无法弄清楚。我尝试了以下内容:

<script type="text/javascript" src="js/jspdf.min.js"></script>

在jQuery之后:

$("#html2pdf").on('click', function(){
    var doc = new jsPDF();
    doc.fromHTML($('body').get(0), 15, 15, {
        'width': 170
    });
    console.log(doc);
});

用于测试目的,但我收到了:

"Cannot read property '#smdadminbar' of undefined"

其中#smdadminbar是从body中第一个div。


这是对我有用的代码:https://github.com/devrajatverma/jsPdfExample - Rajat
3
注意:所有前来寻找fromHTML或者为什么它没有在jsPDF文档中记录的人:"我们将不再支持fromHTML和addHTML,因此我们正在关闭此问题。"(摘自问题编号#516 - toraritte
7个回答

149

您可以按照以下方式将HTML转换为PDF:

步骤1:将以下脚本添加到头部

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>

或者本地下载

步骤2:添加HTML脚本以执行jsPDF代码

自定义此内容以传递标识符,或仅将#content更改为所需的标识符。

 <script>
    function demoFromHTML() {
        var pdf = new jsPDF('p', 'pt', 'letter');
        // source can be HTML-formatted string, or a reference
        // to an actual DOM element from which the text will be scraped.
        source = $('#content')[0];

        // we support special element handlers. Register them with jQuery-style 
        // ID selector for either ID or node name. ("#iAmID", "div", "span" etc.)
        // There is no support for any other type of selectors 
        // (class, of compound) at this time.
        specialElementHandlers = {
            // element with id of "bypass" - jQuery style selector
            '#bypassme': function (element, renderer) {
                // true = "handled elsewhere, bypass text extraction"
                return true
            }
        };
        margins = {
            top: 80,
            bottom: 60,
            left: 40,
            width: 522
        };
        // all coords and widths are in jsPDF instance's declared units
        // 'inches' in this case
        pdf.fromHTML(
            source, // HTML string or DOM elem ref.
            margins.left, // x coord
            margins.top, { // y coord
                'width': margins.width, // max width of content on PDF
                'elementHandlers': specialElementHandlers
            },

            function (dispose) {
                // dispose: object with X, Y of the last line add to the PDF 
                //          this allow the insertion of new lines after html
                pdf.save('Test.pdf');
            }, margins
        );
    }
</script>

步骤三:添加正文内容

<a href="javascript:demoFromHTML()" class="button">Run Code</a>
<div id="content">
    <h1>  
        We support special element handlers. Register them with jQuery-style.
    </h1>
</div>

参考原教程

查看示例代码


4
谢谢发帖,但我尝试了上面的代码(本地),它生成了一个空白的PDF文档。它与jquery 1.11.0完全不兼容,所以我使用了与https://github.com/MrRio/jsPDF/blob/master/examples/js/jquery/jquery-1.7.1.min.js相同的jquery版本。 - user1063287
1
我只能通过使用CloudFlare CDNs才能使此示例正常工作:<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.2.61/jspdf.debug.js"></script> 或 <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.2.61/jspdf.min.js"></script> 但我同意,文档和代码来源的一般变化,增加了使用此插件的难度。甚至这些CDN(JSfiddle使用的)与@Well wisher上面提到的“本地下载”链接也有所不同。 - Great Scott
1
@Scott,我看到他们移除了链接。 - Well Wisher
4
如何使这个打印我的CSS样式? - Mwas
3
请注意,此答案中提供的小提琴使用了2018年11月已被弃用的.fromHTML方法。 - samurai_jane
显示剩余14条评论

19

你只需要这个链接 jspdf.min.js

它包含了所有的东西。

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script>

2
谢谢,这让我很烦恼!使用 jspdf 的调试版本可以工作,而其他任何配置的版本都不能。也许是代码压缩出了问题?或者我做错了什么。 - jookyone
这真的帮了我很多。我一开始使用原始的jspdf.js文件,但它没有起作用。使用jspdf.debug.js就解决了问题。 - Francisco Quintero
有趣的是生产版本为什么不工作...我在HTML页面中包含了所有插件,但只有这个调试版本起作用。 - ilter
请在 GitHub 上检查最新版本,并相应更改上面的 URL。最新版本为1.3.5。 - pasx
1
@omegastripes 看起来他们更新了源代码;https://unpkg.com/jspdf@latest/dist/jspdf.umd.min.js - Ahmet Gokdayi
显示剩余3条评论

14

1
似乎不再起作用了 - jQuery.Deferred 异常: doc.html 不是一个函数 TypeError:doc.html 不是一个函数 - DropHit
你找到解决方案了吗?fromHTML在最新的下载中可以工作。但是,下载的PDF中未呈现svg元素。 - mythicalcoder
@mythicalcoder 我最终编写了自己的类,它将获取DOM树并使用内部jsPDF API构建实际的PDF。这样它实际上是文本,而不是页面的光栅化截图。 - Vitalii Chmovzh
看起来好多了。谢谢回复。 - mythicalcoder

12

这是最终让我做到的事情(并触发了一种倾向):

function onClick() {
  var pdf = new jsPDF('p', 'pt', 'letter');
  pdf.canvas.height = 72 * 11;
  pdf.canvas.width = 72 * 8.5;

  pdf.fromHTML(document.body);

  pdf.save('test.pdf');
};

var element = document.getElementById("clickbind");
element.addEventListener("click", onClick);
<h1>Dsdas</h1>

<a id="clickbind" href="#">Click</a>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.3/jspdf.min.js"></script>

对于那些偏爱 KnockoutJS 的人,这里是一些绑定内容:
ko.bindingHandlers.generatePDF = {
    init: function(element) {

        function onClick() {
            var pdf = new jsPDF('p', 'pt', 'letter');
            pdf.canvas.height = 72 * 11;
            pdf.canvas.width = 72 * 8.5;

            pdf.fromHTML(document.body);

            pdf.save('test.pdf');                    
        };

        element.addEventListener("click", onClick);
    }
};

这段代码还有更多内容吗?当我尝试运行它时,出现了一个错误,指示“pdf.canvas”未定义。“未捕获的类型错误:无法设置未定义的属性'height'。” - Ryan Gibbs
不确定您的意思?片段使用相同的代码执行。因此,您的实现可能存在问题。您能否console.log(pdf)并分享输出。 - pim
可能是缓存问题或其他原因,当我刚才尝试在其中加入console.log()时,代码成功执行了。但我仍然遇到了空白页面的问题,不过那是另一回事了。谢谢。 - Ryan Gibbs
我还遇到了错误:“无法读取属性'addEventListener'”。 - Manjitha Teshara
我很喜欢这个jsPDF()库。顺便说一下,如果有人觉得有用,我刚刚弄明白了如何附加回调以在生成PDF后运行:pdf.save("myfile.pdf", function(){ alert("pdf generation/save finished!"); }); - Christopher

4
Vue.js怎样使用?

function onClick() {
  var pdf = new jsPDF('p', 'pt', 'letter');
  pdf.canvas.height = 72 * 11;
  pdf.canvas.width = 72 * 8.5;

  pdf.fromHTML(document.body);

  pdf.save('test.pdf');
};

var element = document.getElementById("clickbind");
element.addEventListener("click", onClick);
<h1>Dsdas</h1>

<a id="clickbind" href="#">Click</a>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.3/jspdf.min.js"></script>


感谢您发布了有关使用jdpsf的vuejs示例。 - Shane G

3

首先,您需要创建一个处理程序。

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

在点击事件中编写以下代码:

doc.fromHTML($('body').get(0), 15, 15, {
    'width': 170, 
    'elementHandlers': specialElementHandlers
        });

var pdfOutput = doc.output();
            console.log(">>>"+pdfOutput );

假设您已经声明了doc变量。然后,您需要使用File-Plugin保存此PDF文件。

3

你是否也应该使用jspdf.plugin.from_html.js库?除了主要的库(jspdf.js)之外,你必须使用其他库来进行“特殊操作”(例如使用图像的jspdf.plugin.addimage.js)。请查看https://github.com/MrRio/jsPDF


3
jspdf.source.js 似乎包含了所有其他的库。 - whossname

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接