如何使用pdf.js在注释中获取文本(使用过滤器FlateDecode编码的流)?

问题描述 投票:0回答:1

需要用pdf.js解决:

a)使用pdf.js可以使用getAnnotations()获取注释,但不能获得有关该注释中文本的任何信息。如何提取它?

b)如何从对象(ref:gen num)获取流,如:

/N: 8 0 R
/Filter:FlateDecode
javascript annotations pdfjs
1个回答
0
投票

我用以下方法得到了疑问:

我将解释问题和解决方案。

问题

使用PDF.js显示图层从PDF中的注释中提取文本。

PDF.js有不同的层次:

  1. 核心:解析二进制PDF的层
  2. 显示:使用核心层渲染PDF获取文档的信息
  3. Viewer:Firefox和其他浏览器扩展中的PDF查看器UI

要从注释中提取文本,必须在Core和Display层中工作。

I.核心层:

使用注释中的所有文本创建公共属性(annotationText)

a)修改src / core / annotation.js

a.1)类Annotation构造函数:添加一行和构造函数的结尾

    // Expose public properties using a data object.
    this.data = {
      ... 
      annotationText: this._extractText(params) // -> Add this line *****
    };

  }

a.2)类注释 - 为提取文本添加方法:

      _extractText(params) {
      // AP - Appearance Dictionary
      let appearanceDictionary = params.dict.get('AP');
      // No AP
      if (typeof appearanceDictionary === 'undefined') {
         return '';
      }

      // N - Stream 
      let normalAppearance = appearanceDictionary.xref.fetch(appearanceDictionary._map.N);
      normalAppearance.getBytes()
      // No text
      if (typeof normalAppearance.buffer === 'undefined') {
         return '';
      }

      let numParentheses = 0;
      let streamText = '';

      for (let i = 0; i < normalAppearance.buffer.length; i++) {
        if (String.fromCharCode(normalAppearance.buffer[i]) === ")") {
          numParentheses--;
        }
        if (numParentheses > 0) {
        streamText += String.fromCharCode(normalAppearance.buffer[i]);
        }
        if (String.fromCharCode(normalAppearance.buffer[i]) === "(") {
          numParentheses++;
        }
      }

      return streamText;
    }

b)将所有src /文件捆绑成两个生产脚本(pdf.js和pdf.worker.js)

 $ gulp generic

II。显示层:

在annotationText中显示文本

  page.getAnnotations().then(
    function (annotations) {

      let textInAnnotations = ""
      for (annotation in annotations) {

         textInAnnotations = textInAnnotations + " - " + annotations[annotation].annotationText

      }

      console.log("Text in annotations: "+textInAnnotations)

    });
© www.soinside.com 2019 - 2024. All rights reserved.