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

时间:2019-02-08 11:06:56

标签: javascript annotations pdfjs

需要使用pdf.js解决:

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

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

/N: 8 0 R
/Filter:FlateDecode

1 个答案:

答案 0 :(得分:0)

我有以下疑问可以得到答案:

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

问题

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

解决方案

PDF.js具有不同的层:

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

要从注释中提取文本,必须在 Core Display 层中进行。

I。核心层

  

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

a)修改src / core / annotation.js

a.1)类注释构造函数:在构造函数的末尾添加一行

    // 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)

    });