You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Angular 17中如何获取<object>标签内PDF文件的总页数?

在Angular 17中获取加载的PDF总页数

问题根源

你之前遇到的两个问题本质是Angular的作用域限制和PDF嵌入内容的访问限制:

  • 直接给加onload="cargue()"不行,因为组件里的cargue()函数不在全局作用域,浏览器找不到它
  • 即使PDF加载完成,你也没法直接通过document.getElementById访问内部的DOM,因为PDF渲染的内容属于独立的嵌入文档,受同源策略和浏览器沙盒限制

    方案一:用Angular的ViewChild监听加载事件(局限性较大)

    如果一定要用标签,先通过ViewChild获取元素,再手动绑定load事件:

    1. 在组件模板里给加模板引用:
      <object #pdfObject data="your-pdf-url.pdf" type="application/pdf" width="100%" height="600px"></object>
      
      1. 在组件类里获取元素并绑定load事件:
      import { Component, ViewChild, ElementRef, AfterViewInit } from '@angular/core';
      
      @Component({
        selector: 'app-pdf-viewer',
        templateUrl: './pdf-viewer.component.html',
        standalone: true
      })
      export class PdfViewerComponent implements AfterViewInit {
        @ViewChild('pdfObject') pdfObject!: ElementRef<HTMLObjectElement>;
      
        ngAfterViewInit(): void {
          this.pdfObject.nativeElement.addEventListener('load', () => {
            // 这里尝试访问内部文档,但成功率极低,因为浏览器会限制对PDF嵌入内容的访问
            try {
              const pdfDoc = this.pdfObject.nativeElement.contentDocument;
              // 不同浏览器的PDF渲染器结构不一样,这个选择器不一定生效
              const pageInfo = pdfDoc?.querySelector('.some-page-selector');
              if (pageInfo) {
                const totalPages = pageInfo.textContent?.split('/')[1];
                console.log('总页数:', totalPages);
              }
            } catch (err) {
              console.error('无法访问PDF内部内容:', err);
            }
          });
        }
      }
      

      注意:这个方案很不稳定,因为不同浏览器(Chrome、Firefox、Edge)的PDF渲染DOM结构完全不同,而且很多浏览器会阻止脚本访问嵌入的PDF文档,大概率获取不到内容。

      方案二:用PDF.js(推荐,稳定可控)

      直接用Mozilla的PDF.js库加载PDF,能直接获取文档的总页数,完全不受浏览器渲染差异影响:

      1. 安装PDF.js:
      npm install pdfjs-dist
      
      1. 组件代码示例:
      import { Component, OnInit } from '@angular/core';
      import * as pdfjsLib from 'pdfjs-dist';
      import { pdfjsWorker } from 'pdfjs-dist/build/pdf.worker.entry';
      
      // 指定Worker路径
      pdfjsLib.GlobalWorkerOptions.workerSrc = pdfjsWorker;
      
      @Component({
        selector: 'app-pdf-viewer',
        template: `
          <div id="pdf-container"></div>
          <p>总页数:{{ totalPages }}</p>
        `,
        standalone: true
      })
      export class PdfViewerComponent implements OnInit {
        totalPages = 0;
      
        ngOnInit(): void {
          const pdfUrl = 'your-pdf-url.pdf';
          // 加载PDF文档
          pdfjsLib.getDocument(pdfUrl).promise.then((pdfDoc) => {
            this.totalPages = pdfDoc.numPages;
            // 可选:渲染第一页到页面
            pdfDoc.getPage(1).then((page) => {
              const container = document.getElementById('pdf-container');
              if (container) {
                const viewport = page.getViewport({ scale: 1.5 });
                const canvas = document.createElement('canvas');
                const ctx = canvas.getContext('2d');
                canvas.height = viewport.height;
                canvas.width = viewport.width;
                container.appendChild(canvas);
                page.render({ canvasContext: ctx, viewport });
              }
            });
          }).catch((err) => {
            console.error('加载PDF失败:', err);
          });
        }
      }
      

      这个方案完全可控,不管哪个浏览器都能稳定获取总页数,还能自定义PDF的渲染样式和交互,比标签灵活得多。

      内容的提问来源于stack exchange,提问作者Jesus Zapata

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 20:22:38