Angular 项目福音:pdf.js + Elasticpdf,轻松实现PDF批注功能!

时间:2025-02-20 00:07 分类:C++教程

引言

在数字化时代,PDF文件的使用无处不在。无论是商务报告、学术论文还是教育培训资料,PDF格式都因其便携性和易读性而广受欢迎。然而,传统的PDF阅读体验往往缺乏交互性和批注功能,难以满足日益增长的用户需求。幸运的是,随着前端技术的不断发展,我们有了pdf.js和Elasticpdf这两个强大的工具,它们可以将PDF批注功能无缝集成到Angular项目中,让用户在浏览器中享受到更加丰富的PDF阅读体验。

工具库介绍与 Demo

1.1 代码包结构

ElasticPDF是基于开源的pdf.js构建的,它不仅保留了pdf.js的所有独立性和离线特性,还增加了多种开箱即用的PDF批注功能。ElasticPDF的代码包结构清晰明了,易于集成到任何支持JavaScript、HTML和CSS的项目中。无论是在公网还是内网环境下,ElasticPDF都能快速完美地运行。

1.2 Elasticpdf 在线 Demo

ElasticPDF提供了两个版本的批注功能供用户选择:批注合成版和专业批注版。这两个版本的主要区别在于最终的批注保存阶段。用户可以根据自己的需求选择合适的版本进行测试和使用。

移动至 Angular 项目

要将pdf.js或Elasticpdf集成到Angular项目中,首先需要将相应的代码包移动到项目的src/assets文件夹下。接下来,通过<iframe>标签导入viewer.html文件到Angular页面中。如果遇到Uncaught SyntaxError错误,需要修改viewer.html中的引入模式,添加type='module'代码。

导入 viewer.html

<!-- elasticpdf 示例 -->
<iframe src="assets/elasticpdf/web/viewer.html" id="elasticpdf-iframe" (load)="initialPDFEditor()" width="100%" height="700px" frameborder="0"></iframe>

<!-- pdf.js 示例 -->
<iframe src="assets/pdfjs-3.2/web/viewer.html" id="elasticpdf-iframe" (load)="initialPDFEditor()" width="100%" height="700px" frameborder="0"></iframe>

初始化 pdf.js 和 Elasticpdf

在Angular页面中,需要在<iframe>的onLoad()函数下调用initialApp()函数。通过postMessage广播加载状态至Angular页面,并监听pdf加载、编辑、导出等的广播信息。

export class AppComponent {
  elasticpdf_viewer: any = null;
  elasticpdf_iframe: any = null;

  initialPDFEditor() {
    this.elasticpdf_iframe = document.getElementById('elasticpdf-iframe') as HTMLIFrameElement;
    const pdf_url = 'compressed.tracemonkey-pldi-09.pdf';
    if (this.elasticpdf_iframe && this.elasticpdf_iframe.contentWindow) {
      this.elasticpdf_viewer = this.elasticpdf_iframe.contentWindow as any;
      if (this.elasticpdf_viewer?.initialApp) {
        this.elasticpdf_viewer?.initialApp({
          'language': 'en',
          'pdf_url': pdf_url,
          'member_info': {
            'id': 'elasticpdf_id',
            'name': 'elasticpdf',
          },
        });
      }
    }
  }

  @HostListener('window:message', ['$event'])
  onMessage(event: Event) : void {
    const e: any = event;
    if (e.data.source !== 'elasticpdf') { return; }
    // pdf 加载结束的回调,可以在此处导入服务器上储存的批注文件
    if (e.data.function_name === 'pdfLoaded') {
      console.log('Angular PDF loaded 加载成功');
      this.reloadData();
    }
  }

  // 其他代码...
}

导出 pdf 及批注数据

ElasticPDF提供了两种方式来保存批注数据:将批注写入PDF文件或单独保存为JSON文件。推荐使用第二种方式,因为它可以更方便地与服务器进行交互,实现批注数据的云端同步。

export class AppComponent {
  // 其他代码...

  getPDFData() {
    this.elasticpdf_viewer.getPDFData();
  }

  @HostListener('window:message', ['$event'])
  onMessage(event: Event) : void {
    const e: any = event;
    if (e.data.source !== 'elasticpdf') { return; }
    // 接收pdf数据
    if (e.data.function_name === 'downloadPDF') {
      let file_name = e.data.content['file_name'];
      let pdf_blob = e.data.content['pdf_blob'];
      let pdf_base64 = e.data.content['pdf_base64'];
      console.log('PDF信息', pdf_base64);
      // 如果文档没有被编辑过,则 pdf_base64 仍然是文件名
      this.postService('upload-pdf-data', {
        'file_name': file_name,
        'file_id': '123ddasfsdffads',
        'file_data': pdf_base64,
      });
    }
  }

  // 其他代码...
}

重载 pdf 及批注数据

在将pdf批注保存至服务器后,可以通过加载服务器上的批注数据来实现批注的重载和回显。这需要在Angular页面中监听pdf加载完成的事件,并从服务器请求相应的批注数据。

export class AppComponent {
  // 其他代码...

  reloadData() {
    let file_name = 'tutorial.pdf';
    let annotation_content = this.postService('get-annotation-data', {
      'file_name': 'tutorial.pdf',
      'file_id': '123ddasfsdffads',
    });
    this.elasticpdf_viewer.setPureFileAnnotation({
      'file_annotation': annotation_content,
    });
  }

  // 其他代码...
}

总结

通过以上步骤,我们可以将pdf.js和Elasticpdf无缝集成到Angular项目中,实现PDF批注功能。ElasticPDF提供了丰富的批注功能和灵活的导出方式,可以满足各种应用场景的需求。如果你对ElasticPDF有更多的需求或疑问,欢迎联系我们,我们将为你提供详细的示例代码和技术支持。

结语

本文介绍了如何在Angular项目中使用pdf.js和Elasticpdf实现PDF批注功能,帮助开发者轻松提升PDF文件的交互性和实用性。通过简单的集成和配置,你可以在浏览器中享受到更加丰富的PDF阅读体验。希望本文对你有所帮助,祝你在数字化时代的道路上越走越远!

声明:

1、本博客不从事任何主机及服务器租赁业务,不参与任何交易,也绝非中介。博客内容仅记录博主个人感兴趣的服务器测评结果及一些服务器相关的优惠活动,信息均摘自网络或来自服务商主动提供;所以对本博客提及的内容不作直接、间接、法定、约定的保证,博客内容也不具备任何参考价值及引导作用,访问者需自行甄别。

2、访问本博客请务必遵守有关互联网的相关法律、规定与规则;不能利用本博客所提及的内容从事任何违法、违规操作;否则造成的一切后果由访问者自行承担。

3、未成年人及不能独立承担法律责任的个人及群体请勿访问本博客。

4、一旦您访问本博客,即表示您已经知晓并接受了以上声明通告。

本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。

评论 0人参与,0条评论
查看更多

Copyright 2005-2024 yuanmayuan.com 源码园 版权所有 备案信息

声明: 本站非腾讯QQ官方网站 所有软件和文章来自互联网 如有异议 请与本站联系 本站为非赢利性网站 不接受任何赞助和广告