【问题标题】:Export Pdf from html in angular 6以角度 6 从 html 导出 Pdf
【发布时间】:2019-04-22 15:31:14
【问题描述】:

我想以角度 6 从 html 导出 pdf。所以,我正在使用 jspdf 库。但我不能给出像颜色和背景颜色这样的样式。我怎样才能做到这一点? (如果jspdf有其他免费库,我可以使用)你可以从下面的链接中看到演示。

DEMO

.ts 文件

export class AppComponent  {
  @ViewChild('reportContent') reportContent: ElementRef;

    downloadPdf() {
    const doc = new jsPDF();
    const specialElementHandlers = {
      '#editor': function (element, renderer) {
        return true;
      }
    };

    const content = this.reportContent.nativeElement;

    doc.fromHTML(content.innerHTML, 15, 15, {
      'width': 190,
      'elementHandlers': specialElementHandlers
    });

    doc.save('asdfghj' + '.pdf');
  }
}

.html 文件

<div #reportContent class="p-col-8 p-offset-2">
  <table>
    <tr>
      <td style="color: red;background-color: blue;border:solid;">1111
      </td>
      <td style="border:solid;">2222
      </td>
    </tr>
  </table>
</div>

<button pButton type="button" label="Pdf" (click)="downloadPdf()">Export Pdf</button>

【问题讨论】:

  • 您可以使用doc.setFillColor(0, 0, 0)设置背景颜色和doc.setTextColor(255)设置颜色
  • 我投了 +1 票,因为事实上这是一个很好的问题......但我自己没有任何答案。 Openslide 似乎可以做到,但我不知道它是如何工作的 github.com/OpenSlides/OpenSlides
  • 感谢@BenjaminCaure。我不明白为什么有人反对这个问题。
  • 但是,我想要来自 html。不是打字稿代码。因为在实际场景中会有很多细胞。 doc.addHtml 与造型配合得很好。但是在doc.addHtml,pdf 质量很差。 @Bharathkumarkamal

标签: angular typescript angular6 jspdf


【解决方案1】:
    captureScreen() {
        const pdf = new jsPDF('p', 'mm');
        const promises = $('.pdf-intro').map(function(index, element) {
            return new Promise(function(resolve, reject) {
                html2canvas(element, { allowTaint: true, logging: true })
                    .then(function(canvas) {
                        resolve(canvas.toDataURL('image/jpeg', 1.0));
                    })
                    .catch(function(error) {
                        reject('error in PDF page: ' + index);
                    });
            });
        });

        Promise.all(promises).then(function(dataURLS) {
            console.log(dataURLS);
            for (const ind in dataURLS) {
                if (dataURLS.hasOwnProperty(ind)) {
                    console.log(ind);
                    pdf.addImage(
                        dataURLS[ind],
                        'JPEG',
                        0,
                        0,
                        pdf.internal.pageSize.getWidth(),
                        pdf.internal.pageSize.getHeight(),
                    );
                    pdf.addPage();
                }
            }
            pdf.save('HTML-Document.pdf');
        });
    }

有了这个,我们必须在代码中导入jsPDF和html2Canvas

    import * as jsPDF from 'jspdf';
    import * as html2canvas from 'html2canvas';

为此,您必须执行以下 npm install

    npm install jspdf --save
    npm install --save @types/jspdf
    npm install html2canvas --save
    npm install --save @types/html2canvas

在脚本标签内的 angular.json 文件中添加以下内容

    "node_modules/jspdf/dist/jspdf.min.js"

在 component.html 中添加如下代码,例如:

<div>
  <input type="button" value="CPTURE" (click)="captureScreen()" />
</div>
<div class="pdf-intro">HTHML content</div>
<div class="pdf-intro">HTHML content</div>
<div class="pdf-intro">HTHML content</div>
<div class="pdf-intro">HTHML content</div>

使用此代码添加 css,就像您通常在 component.css 中添加的一样,它将被渲染。

希望,这可以解决您的问题。

【讨论】:

    【解决方案2】:

    这样使用stackblitz example 在你demo中这样使用

    import {jsPDF} from 'jspdf';
    
    
    public downloadPDF() {
       const doc = new jsPDF();
       .....
    }
    

    【讨论】:

      【解决方案3】:

      [https://www.c-sharpcorner.com/article/convert-html-to-pdf-using-angular-6/][1 npm 安装 jspdf
      并安装 html2canvas 包,使用给定的 npm 命令。 npm 安装 html2canvas
      完成安装部分后,就可以使用 import 语句将其导入到我们的组件中了。

                  > import * as jspdf from 'jspdf';      import html2canvas from
                  > 'html2canvas';
      
                      <div id="content" #content>  
                  <mat-card>  
                      <div class="alert alert-info">  
                          <strong>Html To PDF Conversion - Angular 6</strong>  
                      </div>  
                      <div>  
                      <input type="button" value="CPTURE" (click)="captureScreen()"/>  
                      </div>  
                  </mat-card>  
                  </div>  
                  <div >  
                  <mat-card>  
                      <table id="contentToConvert">  
                          <tr>  
                          <th>Column1</th>  
                          <th>Column2</th>  
                          <th>Column3</th>  
                          </tr>  
                          <tr>  
                          <td>Row 1</td>  
                          <td>Row 1</td>  
                          <td>Row 1</td>  
                          </tr>  
                          <tr>  
                          <td>Row 2</td>  
                          <td>Row 2</td>  
                          <td>Row 2</td>  
                          </tr>  
                          <tr>  
                          <td>Row 3</td>  
                          <td>Row 3</td>  
                          <td>Row 3</td>  
                          </tr>  
                          <tr>  
                          <td>Row 4</td>  
                          <td>Row 4</td>  
                          <td>Row 4</td>  
                          </tr>  
                          <tr>  
                          <td>Row 5</td>  
                          <td>Row 5</td>  
                          <td>Row 5</td>  
                          </tr>  
                          <tr>  
                          <td>Row 6</td>  
                          <td>Row 6</td>  
                          <td>Row 6</td>  
                          </tr>  
                      </table>  
      
                  </mat-card>  
                  </div>  
      
                      import { Component, OnInit, ElementRef ,ViewChild} from '@angular/core';  
                  import * as jspdf from 'jspdf';  
                  import html2canvas from 'html2canvas';  
      
                  @Component({  
                  selector: 'app-htmltopdf',  
                  templateUrl: './htmltopdf.component.html',  
                  styleUrls: ['./htmltopdf.component.css']  
                  })  
                  export class HtmltopdfComponent{  
                  public captureScreen()  
                  {  
                      var data = document.getElementById('contentToConvert');  
                      html2canvas(data).then(canvas => {  
                      // Few necessary setting options  
                      var imgWidth = 208;   
                      var pageHeight = 295;    
                      var imgHeight = canvas.height * imgWidth / canvas.width;  
                      var heightLeft = imgHeight;  
      
                      const contentDataURL = canvas.toDataURL('image/png')  
                      let pdf = new jspdf('p', 'mm', 'a4'); // A4 size page of PDF  
                      var position = 0;  
                      pdf.addImage(contentDataURL, 'PNG', 0, position, imgWidth, imgHeight)  
                      pdf.save('MYPdf.pdf'); // Generated PDF   
                      });  
                  }  
                  } 
      
                      new JsPDF(  
                      Orientation, // Landscape or Portrait  
      
                      unit, // mm, cm, in  
      
                      format // A2, A4 etc  
                  );  
      

      【讨论】:

        【解决方案4】:

        您可以使用jsPDFdom to image 包导出带有id='dashboard' 的HTML div。

        安装包

        import * as domtoimage from 'dom-to-image';
        import * as FileSaver from 'file-saver';
        import * as jsPDF from 'jspdf';
        

        TS 文件

        domtoimage.toPng(document.getElementById('dashboard'))
            .then(function (blob) {
                var pdf = new jsPDF('l', 'pt', [$('gridster').width(), $('gridster').height()]);
                pdf.addImage(blob, 'PNG', 0, 0, $('gridster').width(), $('gridster').height());
                pdf.save(`${that.dashboardName}.pdf`);
            });
        

        HTML

        <gridster id='dashboard'></gridster>
        

        【讨论】:

          【解决方案5】:

          html2canvas 将解决您的问题。如下所示更新您的代码。

          downloadPdf() {
          const doc = new jsPDF();
          const content = this.reportContent.nativeElement;
          html2canvas(content).then(canvas => {
                  const imgData = canvas.toDataURL('image/png');
                  // Few necessary setting options
                  const imgWidth = 208;
                  const pageHeight = 295;
                  const imgHeight = canvas.height * imgWidth / canvas.width;
                  const doc = new jspdf('p', 'mm');
                  let heightLeft = imgHeight;
                  let position = 0;
          
                  doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
                  heightLeft -= pageHeight;
                  while (heightLeft >= 0) {
                      position = heightLeft - imgHeight;
                      doc.addPage();
                      doc.addImage(imgData, 'PNG', 0, position, imgWidth, imgHeight);
                      heightLeft -= pageHeight;
                  }
                  // Generated PDF
                  doc.save('asdfghj' + '.pdf');
              });
          

          }

          【讨论】:

          • 欢迎来到stackoverflow。考虑在how to write a good answer 上阅读这篇文章。除了您提供的代码之外,请尝试解释一下为什么以及如何解决此问题。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-08-23
          • 2016-06-09
          • 1970-01-01
          • 2019-01-01
          • 1970-01-01
          相关资源
          最近更新 更多