主要是通过和他们和她们html2canvas与jsPDF这两个库来实现

    1. <!DOCTYPE html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>Document</title>
    7. <script src="https://cdn.jsdelivr.net/npm/html2canvas@1.0.0-rc.7/dist/html2canvas.min.js"></script>
    8. <script src="https://cdn.bootcss.com/jspdf/1.3.4/jspdf.debug.js"></script>
    9. <style>
    10. div{
    11. height: 3366px;
    12. }
    13. </style>
    14. </head>
    15. <body>
    16. <button id="exportToPdf">导出为pdf</button>
    17. <div id="export_content">
    18. <img src="http://www.mjjq.com/pic/20070425/20070425014215558.jpg" alt="" height="3366" width="800">
    19. </div>
    20. <script>
    21. var downPdf = document.getElementById("exportToPdf")
    22. downPdf.onclick = function(){
    23. html2canvas(document.getElementById("export_content"), {
    24. onrendered:function(canvas) {
    25. var contentWidth = canvas.width;
    26. var contentHeight = canvas.height;
    27. //一页pdf显示html页面生成的canvas高度;
    28. var pageHeight = contentWidth / 592.28 * 841.89;
    29. //未生成pdf的html页面高度
    30. var leftHeight = contentHeight;
    31. //页面偏移
    32. var position = 0;
    33. //a4纸的尺寸[595.28,841.89],html页面生成的canvas在pdf中图片的宽高
    34. var imgWidth = 595.28;
    35. var imgHeight = 592.28/contentWidth * contentHeight;
    36. 返回一个包含图片展示的 data URI 。可以使用 type 参数其类型,默认为 PNG 格式。图片的分辨率为96dpi
    37. var pageData = canvas.toDataURL('image/jpeg', 1.0);
    38. // 三个参数,第一个方向,第二个单位,第三个尺寸格式
    39. var pdf = new jsPDF('', 'pt', 'a4');
    40. //有两个高度需要区分,一个是html页面的实际高度,和生成pdf的页面高度(841.89)
    41. //当内容未超过pdf一页显示的范围,无需分页
    42. if (leftHeight < pageHeight) {
    43. pdf.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight );
    44. } else {
    45. while(leftHeight > 0) {
    46. pdf.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
    47. leftHeight -= pageHeight;
    48. position -= 841.89;
    49. //避免添加空白页
    50. if(leftHeight > 0) {
    51. //jsPDF提供了一个很有用的API,addPage(),我们可以通过pdf.addPage(),来添加一页pdf,然后通过pdf.addImage(...),将图片赋予这页pdf来显示。
    52. pdf.addPage();
    53. }
    54. }
    55. }
    56. pdf.save('content.pdf');
    57. },
    58. //将背景色设置为白色(默认背景为黑色)
    59. background:"#fff"
    60. })
    61. }
    62. </script>
    63. </body>
    64. </html>

    github上有一篇文章说明比较详细,还有具体的demo:https://github.com/linwalker/render-html-to-pdf

    1. // 三个参数,第一个方向,第二个尺寸,第三个尺寸格式
    2. var doc = new jsPDF('landscape','pt',[205, 155])
    3. // 将图片转化为dataUrl
    4. var imageData = data:image/png;base64,iVBORw0KGgo...’;
    5. //设置字体大小
    6. doc.setFontSize(20);
    7. //10,20这两参数控制文字距离左边,与上边的距离
    8. doc.text('Stone', 10, 20);
    9. // 0, 40, 控制文字距离左边,与上边的距离
    10. doc.addImage(imageData, 'PNG', 0, 40, 205, 115);
    11. doc.save('a4.pdf')

    最后附上几个jsPDF的官方网址:
    http://rawgit.com/MrRio/jsPDF/master/
    http://rawgit.com/MrRio/jsPDF/master/docs/index.html
    http://mrrio.github.io/