【问题标题】:jsPDF html method always failsjsPDF html方法总是失败
【发布时间】:2023-08-20 11:23:01
【问题描述】:

我正在尝试从包含一些内容的 html 元素(div)生成 PDF:

<div id = "toPDF">
<table >
  <thead>
    <tr>
      <th>Destination</th>
      <th>Start Date</th>
      <th>End Date</th>
      <th>Comment</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Dest1</td>
      <td>Date1</td>
      <td>Date2</td>
      <td>Comment1</td>
    </tr>
  </tbody>
</table>
</div>

.
.
.
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/0.4.1/html2canvas.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.debug.js" integrity="sha384-NaWTHo/8YCBYJ59830LTz/P4aQZK1sS0SneOgAvhsIl3zBu8r9RevNg5lHCHAuQ/" crossorigin="anonymous"></script>
<script src="app.js"></script>

我正在使用以下 javascript:

window.html2canvas = html2canvas;

var elem = document.getElementById('toPDF');

pdf.html(elem,
    {
        x: 20,
        y: 140,
        callback:
            function (pdf) {
                pdf.text(80, 230, "Test Text");
                var iframe = document.createElement('iframe');
                iframe.setAttribute('style', 'position:absolute;top:0;right:0;height:100%; width:600px');
                document.body.appendChild(iframe);
                iframe.src = pdf.output('datauristring');
            }
    });

生成的 PDF 显示“测试文本”,但没有 html 表的痕迹。如果我删除“测试文本”,则输出 PDF 为空。浏览器控制台显示如下错误:

TypeError: Argument 1 of CanvasRenderingContext2D.drawImage could not be converted to any of: HTMLImageElement, SVGImageElement, HTMLCanvasElement, HTMLVideoElement, ImageBitmap

我尝试了不同的选择。我要求一个有效的 jsPDF.html() 示例。

【问题讨论】:

  • 你不需要 iframe。这是一个工作示例:*.com/a/56415117/4271117
  • @WeihuiGuo:我试过你的代码,但没有区别。新页面打开并显示一个文档,但它完全是空白的。

标签: html jspdf


【解决方案1】:

问题很可能是您使用的html2canvas 版本。 html2canvas 0.4.1 不会工作。它应该是html2canvas 1.0.0-alpha.11 或更高版本。但是,当前版本 html2canvas 1.0.0-rc.3 也不起作用,它也给了我一个空白页。至少html2canvas 1.0.0-alpha.12 对我仍然有效。

<script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.debug.js" 
        integrity="sha384-NaWTHo/8YCBYJ59830LTz/P4aQZK1sS0SneOgAvhsIl3zBu8r9RevNg5lHCHAuQ/"
        crossorigin="anonymous"></script>
<script src="~/lib/html2canvas/html2canvas.min.js"></script>
<!-- html2canvas 1.0.0-alpha.11 or html2canvas 1.0.0-alpha.12 is needed -->
<script>
    function download() {
        let pdf = new jsPDF('p', 'pt', 'a4');

        pdf.html(document.getElementById('toPDF'), {
            callback: function () {
                window.open(pdf.output('bloburl'));
            }
        });
    }
</script>

更新:适合我的最新版本是html2canvas v1.0.0-rc.1

【讨论】:

  • 我按照您的建议尝试了最后一个版本,但不幸的是它没有任何区别。仍然是空白页,没有错误。
  • 不,你不明白。我的意思是不要使用最后一个版本。仔细阅读答案。
  • 感谢您的回答。我的 pdf 被生成,但是,一半的内容不在页面上,它削减了结果 pdf 中的一些内容。是否有选择所有内容的选项?
  • @EfronA。您可以尝试使用the scale in html2canvas