如何正确使用jsPDF库


84

我想将某些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身体的第一个div在哪里。



1
注意所有谁在这里得到试图找出fromHTML“:为什么它没有在jsPDF文档记录。我们正在关闭这个问题,因为我们不会支持任何更长fromHTML和addHTML ”(从问题#516
toraritte

Answers:


133

您可以按如下方式使用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>

步骤3:添加身体内容

<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所以我用同样的jQuery版本上所使用github.com/MrRio/jsPDF/blob/master/examples/js/jquery/...
user1063287

对库文件itdself尝试了代码@Well Wisher,给我以下错误–无法读取未定义jspdf.plugin.from_html.js:500的属性“ length”
学习者

1
是的,这确实非常好,,,但是JSPdf的输出与表元素的另一个元素重叠,我该如何解决呢?...。我已经更改了字体的大小并将其设置为横向模式,大多数修改,但没有任何效果
Sudhir Belagali

1
我只能通过使用CloudFlare CDN来使此示例工作:<script src =“ cdnjs.cloudflare.com/ajax/libs/jspdf/1.2.61/… >或<script src =” cdnjs.cloudflare.com /ajax/libs/jspdf/1.2.61/… >但我同意,文档和代码源的一般变体会增加使用此插件的难度。甚至这些CDN(JSfiddle所使用的CDN)也不同于上面的“本地下载”链接@Well wisher参考。
斯科特,

1
@Scott我将他们删除链接
嗯好心人

17

您只需要此链接jspdf.min.js

它拥有一切。

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

2
谢谢,这让我发疯!使用jspdf的调试版本是可行的,而任何配置中的其他版本都没有。缩小可能会以某种方式打破它?或我做错了。
jookyone 2015年

这真的帮助了我。我正在使用原始的jspdf.js文件,但无法正常工作。使用jspdf.debug.js完成了工作。
Francisco Quintero

有趣的为什么生产版本无法正常工作...我在html页面中包含了所有插件,但是,只有此调试版本才有用。
2015年

嗨,我试过了,但是Error in function FileSaver@http://mrrio.github.io/jsPDF/dist/jspdf.debug.js:5875:18: get_URL(...).createObjectURL is not a function如果使用Bower版本,我会收到错误消息。有什么线索吗?
dbr

在GitHub上检查最新版本,并相应地更改上面的URL。最新的是1.3.5。
pasx

8

终于这对我做了什么(并触发了处置):

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”未定义。“未捕获的TypeError:无法设置未定义的属性'height'”
Ryan Gibbs,

不明白你的意思?该代码段使用相同的代码执行。因此,也许在您的实现中有些问题。您能否console.log(pdf)并共享输出。
pim

这一定是缓存问题,当我刚刚在其中尝试使用console.log()尝试执行该代码时,代码已正确执行。我仍然遇到空白页问题,但这是另一回事。谢谢。
瑞安·吉布斯

我也有错误“无法读取属性'addEventListener'”
Manjitha Teshara

我喜欢这个jsPDF()库。顺便说一句,如果其他人觉得这很有用,我只是想出了在生成PDF后附加一个回调以运行的语法:pdf.save("myfile.pdf", function(){ alert("pdf generation/save finished!"); });
Christopher D. Emerson


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

根据最新版本(1.5.3),没有fromHTML()方法了。相反,您应该使用jsPDF HTML插件,请参阅:https ://rawgit.com/MrRio/jsPDF/master/docs/module-html.html#~html

您还需要添加html2canvas库以使其正常工作:https : //github.com/niklasvh/html2canvas

JS(来自API文档):

var doc = new jsPDF();   

doc.html(document.body, {
   callback: function (doc) {
     doc.save();
   }
});

您也可以提供HTML字符串,而不是引用DOM元素。


似乎也无法正常工作-jQuery.Deferred异常:doc.html不是函数TypeError:doc.html不是函数
DropHit

1

在vuejs中如何适用?

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
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.