使用Angularjs中的pdfMake从HTML生成PDF

59

我正在尝试使用 pdfMakeAngular(我也尝试过 jsPDF,但也无法工作)从HTML创建 PDF。我在我的Angular控制器中尝试使用以下代码:

var blob = new Blob([document.getElementById('exportable').innerHTML])
var docDefinition = {
    content: [blob]
}
pdfMake.createPdf(docDefinition).open();

但我收到了以下错误信息:

无法识别文档结构:{"_margin":null}。

我的HTML由一个div中的两个简单表格组成,名称为exportable

如果有人知道解决此问题的方法或另一种从Angular将HTML转换为PDF的方式,请务必帮忙。

非常感谢任何帮助!

5个回答

104

好的,我弄清楚了。

  1. 你需要使用 html2canvaspdfmake。你不需要在app.js中进行注入,只需将它们包含在script标记中即可。

  2. 在您想要创建PDF的div上添加一个ID名称,如下所示:

 <div id="exportthis">
  • 在你的 Angular 控制器中,使用 div 的 id 作为 html2canvas 的调用参数:

  • 使用 toDataURL() 将 canvas 转换成图片

  • 然后,在 pdfmake 的 docDefinition 中将图片分配给 content。

  • 控制器中完成的代码如下所示:

  •        html2canvas(document.getElementById('exportthis'), {
                onrendered: function (canvas) {
                    var data = canvas.toDataURL();
                    var docDefinition = {
                        content: [{
                            image: data,
                            width: 500,
                        }]
                    };
                    pdfMake.createPdf(docDefinition).download("Score_Details.pdf");
                }
            });
    

    我希望这可以帮助其他人。编码愉快!


    9
    如果图像很大,这能创建多个页面吗? - TechTurtle
    1
    这不应该放在控制器中,因为你正在访问DOM。 - Chrillewoodz
    1
    如果我们尝试打印整个视图,其中包括许多子视图的视图,并且该视图包含指向其他控制器和视图的指令。这是否也会保持网页的完整性,包括视图中不存在的 CSS。 - mjwrazor
    10
    如果文档超过一页,这种方法就不起作用了。 - Gi1ber7
    1
    @RaniRadcliff 它可以工作,但仍然存在一个问题,PDF只生成一页,这会截断其余的内容,您知道如何动态添加页面吗? - Nikhil Radadiya
    显示剩余21条评论

    33

    虽然不是与此帖子相关的内容,但可能对其他人在客户端上将HTML转换为PDF有帮助。如果您使用Kendo,则这是一个简单的解决方案。它还会保留CSS(大多数情况下)。

    var generatePDF = function() {
      kendo.drawing.drawDOM($("#formConfirmation")).then(function(group) {
        kendo.drawing.pdf.saveAs(group, "Converted PDF.pdf");
      });
    }
    <!DOCTYPE html>
    <html lang="en">
    
    <head>
      <meta charset="utf-8">
      <meta http-equiv="X-UA-Compatible" content="IE=edge">
      <meta name="viewport" content="width=device-width, initial-scale=1">
      <!-- Latest compiled and minified CSS -->
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
      <!-- Optional theme -->
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap-theme.min.css">
      <script src="https://ajax.googleapis.com/ajax/libs/jquery/1.12.4/jquery.min.js"></script>
      <!-- Latest compiled and minified JavaScript -->
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/js/bootstrap.min.js"></script>
      <script src="//kendo.cdn.telerik.com/2016.3.914/js/kendo.all.min.js"></script>
    </head>
    
    <body>
      <br/>
      <button class="btn btn-primary" onclick="generatePDF()"><i class="fa fa-save"></i> Save as PDF</button>
      <br/>
      <br/>
      <div id="formConfirmation">
    
        <div class="container theme-showcase" role="main">
          <!-- Main jumbotron for a primary marketing message or call to action -->
          <div class="jumbotron">
            <h1>Theme example</h1>
            <p>This is a template showcasing the optional theme stylesheet included in Bootstrap. Use it as a starting point to create something more unique by building on or modifying it.</p>
          </div>
          <div class="page-header">
            <h1>Buttons</h1>
          </div>
          <p>
            <button type="button" class="btn btn-lg btn-default">Default</button>
            <button type="button" class="btn btn-lg btn-primary">Primary</button>
            <button type="button" class="btn btn-lg btn-success">Success</button>
            <button type="button" class="btn btn-lg btn-info">Info</button>
            <button type="button" class="btn btn-lg btn-warning">Warning</button>
            <button type="button" class="btn btn-lg btn-danger">Danger</button>
            <button type="button" class="btn btn-lg btn-link">Link</button>
          </p>
          <p>
            <button type="button" class="btn btn-default">Default</button>
            <button type="button" class="btn btn-primary">Primary</button>
            <button type="button" class="btn btn-success">Success</button>
            <button type="button" class="btn btn-info">Info</button>
            <button type="button" class="btn btn-warning">Warning</button>
            <button type="button" class="btn btn-danger">Danger</button>
            <button type="button" class="btn btn-link">Link</button>
          </p>
          <p>
            <button type="button" class="btn btn-sm btn-default">Default</button>
            <button type="button" class="btn btn-sm btn-primary">Primary</button>
            <button type="button" class="btn btn-sm btn-success">Success</button>
            <button type="button" class="btn btn-sm btn-info">Info</button>
            <button type="button" class="btn btn-sm btn-warning">Warning</button>
            <button type="button" class="btn btn-sm btn-danger">Danger</button>
            <button type="button" class="btn btn-sm btn-link">Link</button>
          </p>
          <p>
            <button type="button" class="btn btn-xs btn-default">Default</button>
            <button type="button" class="btn btn-xs btn-primary">Primary</button>
            <button type="button" class="btn btn-xs btn-success">Success</button>
            <button type="button" class="btn btn-xs btn-info">Info</button>
            <button type="button" class="btn btn-xs btn-warning">Warning</button>
            <button type="button" class="btn btn-xs btn-danger">Danger</button>
            <button type="button" class="btn btn-xs btn-link">Link</button>
          </p>
          <div class="page-header">
            <h1>Tables</h1>
          </div>
          <div class="row">
            <div class="col-md-6">
              <table class="table">
                <thead>
                  <tr>
                    <th>#</th>
                    <th>First Name</th>
                    <th>Last Name</th>
                    <th>Username</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td>1</td>
                    <td>Mark</td>
                    <td>Otto</td>
                    <td>@mdo</td>
                  </tr>
                  <tr>
                    <td>2</td>
                    <td>Jacob</td>
                    <td>Thornton</td>
                    <td>@fat</td>
                  </tr>
                  <tr>
                    <td>3</td>
                    <td>Larry</td>
                    <td>the Bird</td>
                    <td>@twitter</td>
                  </tr>
                </tbody>
              </table>
            </div>
            <div class="col-md-6">
              <table class="table table-striped">
                <thead>
                  <tr>
                    <th>#</th>
                    <th>First Name</th>
                    <th>Last Name</th>
                    <th>Username</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td>1</td>
                    <td>Mark</td>
                    <td>Otto</td>
                    <td>@mdo</td>
                  </tr>
                  <tr>
                    <td>2</td>
                    <td>Jacob</td>
                    <td>Thornton</td>
                    <td>@fat</td>
                  </tr>
                  <tr>
                    <td>3</td>
                    <td>Larry</td>
                    <td>the Bird</td>
                    <td>@twitter</td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <div class="row">
            <div class="col-md-6">
              <table class="table table-bordered">
                <thead>
                  <tr>
                    <th>#</th>
                    <th>First Name</th>
                    <th>Last Name</th>
                    <th>Username</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td rowspan="2">1</td>
                    <td>Mark</td>
                    <td>Otto</td>
                    <td>@mdo</td>
                  </tr>
                  <tr>
                    <td>Mark</td>
                    <td>Otto</td>
                    <td>@TwBootstrap</td>
                  </tr>
                  <tr>
                    <td>2</td>
                    <td>Jacob</td>
                    <td>Thornton</td>
                    <td>@fat</td>
                  </tr>
                  <tr>
                    <td>3</td>
                    <td colspan="2">Larry the Bird</td>
                    <td>@twitter</td>
                  </tr>
                </tbody>
              </table>
            </div>
            <div class="col-md-6">
              <table class="table table-condensed">
                <thead>
                  <tr>
                    <th>#</th>
                    <th>First Name</th>
                    <th>Last Name</th>
                    <th>Username</th>
                  </tr>
                </thead>
                <tbody>
                  <tr>
                    <td>1</td>
                    <td>Mark</td>
                    <td>Otto</td>
                    <td>@mdo</td>
                  </tr>
                  <tr>
                    <td>2</td>
                    <td>Jacob</td>
                    <td>Thornton</td>
                    <td>@fat</td>
                  </tr>
                  <tr>
                    <td>3</td>
                    <td colspan="2">Larry the Bird</td>
                    <td>@twitter</td>
                  </tr>
                </tbody>
              </table>
            </div>
          </div>
          <div class="page-header">
            <h1>Thumbnails</h1>
          </div>
          <img data-src="holder.js/200x200" class="img-thumbnail" alt="A generic square placeholder image with a white border around it, making it resemble a photograph taken with an old instant camera">
          <div class="page-header">
            <h1>Labels</h1>
          </div>
          <h1>
            <span class="label label-default">Default</span>
            <span class="label label-primary">Primary</span>
            <span class="label label-success">Success</span>
            <span class="label label-info">Info</span>
            <span class="label label-warning">Warning</span>
            <span class="label label-danger">Danger</span>
          </h1>
          <h2>
            <span class="label label-default">Default</span>
            <span class="label label-primary">Primary</span>
            <span class="label label-success">Success</span>
            <span class="label label-info">Info</span>
            <span class="label label-warning">Warning</span>
            <span class="label label-danger">Danger</span>
          </h2>
          <h3>
            <span class="label label-default">Default</span>
            <span class="label label-primary">Primary</span>
            <span class="label label-success">Success</span>
            <span class="label label-info">Info</span>
            <span class="label label-warning">Warning</span>
            <span class="label label-danger">Danger</span>
          </h3>
          <h4>
            <span class="label label-default">Default</span>
            <span class="label label-primary">Primary</span>
            <span class="label label-success">Success</span>
            <span class="label label-info">Info</span>
            <span class="label label-warning">Warning</span>
            <span class="label label-danger">Danger</span>
          </h4>
          <h5>
            <span class="label label-default">Default</span>
            <span class="label label-primary">Primary</span>
            <span class="label label-success">Success</span>
            <span class="label label-info">Info</span>
            <span class="label label-warning">Warning</span>
            <span class="label label-danger">Danger</span>
          </h5>
          <h6>
            <span class="label label-default">Default</span>
            <span class="label label-primary">Primary</span>
            <span class="label label-success">Success</span>
            <span class="label label-info">Info</span>
            <span class="label label-warning">Warning</span>
            <span class="label label-danger">Danger</span>
          </h6>
          <p>
            <span class="label label-default">Default</span>
            <span class="label label-primary">Primary</span>
            <span class="label label-success">Success</span>
            <span class="label label-info">Info</span>
            <span class="label label-warning">Warning</span>
            <span class="label label-danger">Danger</span>
          </p>
          <div class="page-header">
            <h1>Badges</h1>
          </div>
          <p>
            <a href="#">Inbox <span class="badge">42</span></a>
          </p>
          <ul class="nav nav-pills" role="tablist">
            <li role="presentation" class="active"><a href="#">Home <span class="badge">42</span></a>
            </li>
            <li role="presentation"><a href="#">Profile</a>
            </li>
            <li role="presentation"><a href="#">Messages <span class="badge">3</span></a>
            </li>
          </ul>
          <div class="page-header">
            <h1>Dropdown menus</h1>
          </div>
          <div class="dropdown theme-dropdown clearfix">
            <a id="dropdownMenu1" href="#" class="sr-only dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
            <ul class="dropdown-menu" aria-labelledby="dropdownMenu1">
              <li class="active"><a href="#">Action</a>
              </li>
              <li><a href="#">Another action</a>
              </li>
              <li><a href="#">Something else here</a>
              </li>
              <li role="separator" class="divider"></li>
              <li><a href="#">Separated link</a>
              </li>
            </ul>
          </div>
          <div class="page-header">
            <h1>Navs</h1>
          </div>
          <ul class="nav nav-tabs" role="tablist">
            <li role="presentation" class="active"><a href="#">Home</a>
            </li>
            <li role="presentation"><a href="#">Profile</a>
            </li>
            <li role="presentation"><a href="#">Messages</a>
            </li>
          </ul>
          <ul class="nav nav-pills" role="tablist">
            <li role="presentation" class="active"><a href="#">Home</a>
            </li>
            <li role="presentation"><a href="#">Profile</a>
            </li>
            <li role="presentation"><a href="#">Messages</a>
            </li>
          </ul>
          <div class="page-header">
            <h1>Navbars</h1>
          </div>
          <nav class="navbar navbar-default">
            <div class="container">
              <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
                  <span class="sr-only">Toggle navigation</span>
                  <span class="icon-bar"></span>
                  <span class="icon-bar"></span>
                  <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#">Project name</a>
              </div>
              <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                  <li class="active"><a href="#">Home</a>
                  </li>
                  <li><a href="#about">About</a>
                  </li>
                  <li><a href="#contact">Contact</a>
                  </li>
                  <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
                    <ul class="dropdown-menu">
                      <li><a href="#">Action</a>
                      </li>
                      <li><a href="#">Another action</a>
                      </li>
                      <li><a href="#">Something else here</a>
                      </li>
                      <li role="separator" class="divider"></li>
                      <li class="dropdown-header">Nav header</li>
                      <li><a href="#">Separated link</a>
                      </li>
                      <li><a href="#">One more separated link</a>
                      </li>
                    </ul>
                  </li>
                </ul>
              </div>
              <!--/.nav-collapse -->
            </div>
          </nav>
          <nav class="navbar navbar-inverse">
            <div class="container">
              <div class="navbar-header">
                <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target=".navbar-collapse">
                  <span class="sr-only">Toggle navigation</span>
                  <span class="icon-bar"></span>
                  <span class="icon-bar"></span>
                  <span class="icon-bar"></span>
                </button>
                <a class="navbar-brand" href="#">Project name</a>
              </div>
              <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                  <li class="active"><a href="#">Home</a>
                  </li>
                  <li><a href="#about">About</a>
                  </li>
                  <li><a href="#contact">Contact</a>
                  </li>
                  <li class="dropdown">
                    <a href="#" class="dropdown-toggle" data-toggle="dropdown" role="button" aria-haspopup="true" aria-expanded="false">Dropdown <span class="caret"></span></a>
                    <ul class="dropdown-menu">
                      <li><a href="#">Action</a>
                      </li>
                      <li><a href="#">Another action</a>
                      </li>
                      <li><a href="#">Something else here</a>
                      </li>
                      <li role="separator" class="divider"></li>
                      <li class="dropdown-header">Nav header</li>
                      <li><a href="#">Separated link</a>
                      </li>
                      <li><a href="#">One more separated link</a>
                      </li>
                    </ul>
                  </li>
                </ul>
              </div>
              <!--/.nav-collapse -->
            </div>
          </nav>
          <div class="page-header">
            <h1>Alerts</h1>
          </div>
          <div class="alert alert-success" role="alert">
            <strong>Well done!</strong> You successfully read this important alert message.
          </div>
          <div class="alert alert-info" role="alert">
            <strong>Heads up!</strong> This alert needs your attention, but it's not super important.
          </div>
          <div class="alert alert-warning" role="alert">
            <strong>Warning!</strong> Best check yo self, you're not looking too good.
          </div>
          <div class="alert alert-danger" role="alert">
            <strong>Oh snap!</strong> Change a few things up and try submitting again.
          </div>
          <div class="page-header">
            <h1>Progress bars</h1>
          </div>
          <div class="progress">
            <div class="progress-bar" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%;"><span class="sr-only">60% Complete</span>
            </div>
          </div>
          <div class="progress">
            <div class="progress-bar progress-bar-success" role="progressbar" aria-valuenow="40" aria-valuemin="0" aria-valuemax="100" style="width: 40%"><span class="sr-only">40% Complete (success)</span>
            </div>
          </div>
          <div class="progress">
            <div class="progress-bar progress-bar-info" role="progressbar" aria-valuenow="20" aria-valuemin="0" aria-valuemax="100" style="width: 20%"><span class="sr-only">20% Complete</span>
            </div>
          </div>
          <div class="progress">
            <div class="progress-bar progress-bar-warning" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%"><span class="sr-only">60% Complete (warning)</span>
            </div>
          </div>
          <div class="progress">
            <div class="progress-bar progress-bar-danger" role="progressbar" aria-valuenow="80" aria-valuemin="0" aria-valuemax="100" style="width: 80%"><span class="sr-only">80% Complete (danger)</span>
            </div>
          </div>
          <div class="progress">
            <div class="progress-bar progress-bar-striped" role="progressbar" aria-valuenow="60" aria-valuemin="0" aria-valuemax="100" style="width: 60%"><span class="sr-only">60% Complete</span>
            </div>
          </div>
          <div class="progress">
            <div class="progress-bar progress-bar-success" style="width: 35%"><span class="sr-only">35% Complete (success)</span>
            </div>
            <div class="progress-bar progress-bar-warning" style="width: 20%"><span class="sr-only">20% Complete (warning)</span>
            </div>
            <div class="progress-bar progress-bar-danger" style="width: 10%"><span class="sr-only">10% Complete (danger)</span>
            </div>
          </div>
          <div class="page-header">
            <h1>List groups</h1>
          </div>
          <div class="row">
            <div class="col-sm-4">
              <ul class="list-group">
                <li class="list-group-item">Cras justo odio</li>
                <li class="list-group-item">Dapibus ac facilisis in</li>
                <li class="list-group-item">Morbi leo risus</li>
                <li class="list-group-item">Porta ac consectetur ac</li>
                <li class="list-group-item">Vestibulum at eros</li>
              </ul>
            </div>
            <!-- /.col-sm-4 -->
            <div class="col-sm-4">
              <div class="list-group">
                <a href="#" class="list-group-item active">
                  Cras justo odio
                </a>
                <a href="#" class="list-group-item">Dapibus ac facilisis in</a>
                <a href="#" class="list-group-item">Morbi leo risus</a>
                <a href="#" class="list-group-item">Porta ac consectetur ac</a>
                <a href="#" class="list-group-item">Vestibulum at eros</a>
              </div>
            </div>
            <!-- /.col-sm-4 -->
            <div class="col-sm-4">
              <div class="list-group">
                <a href="#" class="list-group-item active">
                  <h4 class="list-group-item-heading">List group item heading</h4>
                  <p class="list-group-item-text">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
                </a>
                <a href="#" class="list-group-item">
                  <h4 class="list-group-item-heading">List group item heading</h4>
                  <p class="list-group-item-text">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
                </a>
                <a href="#" class="list-group-item">
                  <h4 class="list-group-item-heading">List group item heading</h4>
                  <p class="list-group-item-text">Donec id elit non mi porta gravida at eget metus. Maecenas sed diam eget risus varius blandit.</p>
                </a>
              </div>
            </div>
            <!-- /.col-sm-4 -->
          </div>
          <div class="page-header">
            <h1>Panels</h1>
          </div>
          <div class="row">
            <div class="col-sm-4">
              <div class="panel panel-default">
                <div class="panel-heading">
                  <h3 class="panel-title">Panel title</h3>
                </div>
                <div class="panel-body">
                  Panel content
                </div>
              </div>
              <div class="panel panel-primary">
                <div class="panel-heading">
                  <h3 class="panel-title">Panel title</h3>
                </div>
                <div class="panel-body">
                  Panel content
                </div>
              </div>
            </div>
            <!-- /.col-sm-4 -->
            <div class="col-sm-4">
              <div class="panel panel-success">
                <div class="panel-heading">
                  <h3 class="panel-title">Panel title</h3>
                </div>
                <div class="panel-body">
                  Panel content
                </div>
              </div>
              <div class="panel panel-info">
                <div class="panel-heading">
                  <h3 class="panel-title">Panel title</h3>
                </div>
                <div class="panel-body">
                  Panel content
                </div>
              </div>
            </div>
            <!-- /.col-sm-4 -->
            <div class="col-sm-4">
              <div class="panel panel-warning">
                <div class="panel-heading">
                  <h3 class="panel-title">Panel title</h3>
                </div>
                <div class="panel-body">
                  Panel content
                </div>
              </div>
              <div class="panel panel-danger">
                <div class="panel-heading">
                  <h3 class="panel-title">Panel title</h3>
                </div>
                <div class="panel-body">
                  Panel content
                </div>
              </div>
            </div>
            <!-- /.col-sm-4 -->
          </div>
        </div>
    </body>
    
    </html>


    1
    滚动条怎么办?如果数据太长,那么PDF应该像这样导出,对吧?我已经尝试过并投了赞成票,但在我的情况下,我的div中有可滚动的数据,请在这里添加scroll-able true,我已经尝试了很多次。 - Jigar7521
    据我所见,在kendo pdf导出中存在一些限制。例如,如果您的div被隐藏了,它将给您一个空白的pdf。正如kendo建议的那样,这里有一个解决方法http://docs.telerik.com/kendo-ui/framework/drawing/drawing-dom#off-screen-content。因此,如果您有一个可滚动的元素,可以创建一个带有style="position: absolute;width: 800px;left: -10000px;top: 0;"的div,并将要在pdf中导出的所有内容移动到该div中。或者使用具有scrollable->virtual选项的kendo网格,它可以导出包含网格中所有数据的pdf。 - Mahib
    @Mahib 你对于像nvd3图表这样的svg元素有什么看法?因为它们在PDF中无法显示。 - Dixit
    已知限制 >> http://docs.telerik.com/kendo-ui/framework/drawing/drawing-dom#known-limitations - Mahib
    这很容易,而且它有效。 - evilom
    显示剩余3条评论

    2

    我用这种方式 - 或许对某些人有用

         import pdfMake from 'pdfmake/build/pdfmake';
         import htmlToPdfmake from 'html-to-pdfmake';
            
              saveReport() {
              //Learning the html code of the table
                let pdfTable = document.querySelector('#tableDataVM').innerHTML;
                var html = htmlToPdfmake(pdfTable);
                pdfMake.createPdf({
                  info: {
                    title: "Disposal Report",
                    author:'mikka',
                    subject:'Theme',
                        keywords:'Report'
                  },
                  footer: function (currentPage, pageCount) {
                    return {
                      margin: 10,
                      columns: [
                        {
                          fontSize: 9,
                          text: [
                            {
                              text: 'Page ' + currentPage.toString() + ' of ' + pageCount,
                            }
                          ],
                          alignment: 'center'
                        }
                      ]
                    };
                  },
                  content: [
                    {
                      text: "Disposal report for the period " + this.lastPeriod + " by average\n\n",
                      style: 'header',
                      alignment: 'center',
                      fontSize: 14
                    },
                    {
                      text:
                        "Param1: " + this.dataTableReport.host + " (" + this.dataTableReport.hostdescription + ")\n" +
                        "Param2: " + this.dataTableReport.claster + " (" + this.dataTableReport.clasterdescription + ")\n" +
                        "Param3: " + this.dataTableReport.pull + " (" + this.dataTableReport.pulldescription + ")\n",
                      fontSize: 10,
                      margin: [0, 0, 0, 20],
                      alignment: 'left'
                    },
                    html
                  ],
                  pageOrientation: 'landscape'//'portrait'
                }).open();
              }
    

    1

    这是对我有用的方法 我正在从Angular2应用程序中使用html2pdf,因此我在控制器中引用了这个函数

    var html2pdf = (function(html2canvas, jsPDF) {
    

    声明在html2pdf.js中。

    因此,在我的angular控制器的导入声明之后,我添加了这个声明:

    declare function html2pdf(html2canvas, jsPDF): any;
    

    然后,在我的 Angular 控制器的一个方法中,我调用了这个函数:

    generate_pdf(){
        this.someService.loadContent().subscribe(
          pdfContent => {
            html2pdf(pdfContent, {
              margin:       1,
              filename:     'myfile.pdf',
              image:        { type: 'jpeg', quality: 0.98 },
              html2canvas:  { dpi: 192, letterRendering: true },
              jsPDF:        { unit: 'in', format: 'A4', orientation: 'portrait' }
            });
          }
        );
      }
    

    希望有所帮助。

    请问您能否展示一下您的Angular2组件代码? - Nikhil Radadiya
    代码在那里,你有GitHub链接或其他什么可以查看吗? - Rene Enriquez
    这是我用于生成PDF的component.ts代码 https://gist.github.com/NikhilRadadiya/a5812171aac5497aa3134a3aaa1a8f4a - Nikhil Radadiya
    你需要声明以下函数:function html2pdf(html2canvas, jsPDF): any; - Rene Enriquez

    0

    这是在Service-Now平台上实现的。无需使用其他库——makepdf拥有您所需的一切!

    这是我的HTML部分(包括预加载器gif):

       <div class="pdf-preview" ng-init="generatePDF(true)">
        <object data="{{c.content}}" type="application/pdf" style="width:58vh;height:88vh;" ng-if="c.content" ></object>
        <div ng-if="!c.content">
          <img src="https://support.lenovo.com/esv4/images/loading.gif" width="50" height="50">
        </div>
      </div>
    

    这是客户端脚本(JS部分)

    $scope.generatePDF = function (preview) {
        docDefinition = {} //you rootine to generate pdf content
        //...
        if (preview) {
            pdfMake.createPdf(docDefinition).getDataUrl(function(dataURL) {
                c.content = dataURL;
            });
        }
    }
    

    在页面加载时,我会触发init函数来生成PDF内容,并且如果需要预览(设置为true),则将结果分配给c.content变量。在HTML方面,直到c.content获得一个值之前,对象将不会显示出来,因此会显示加载动画。

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