如何让TypeScript加载PDF.js NPM模块和@types绑定,以生成工作的Node.JS代码?

mfpqipee  于 2023-05-06  发布在  Node.js
关注(0)|答案(6)|浏览(171)

上下文

我正在尝试将PDF.JS导入TypeScript项目。我正在使用DefinitelyTyped bindings for pdfjs-dist,通过npm install @types/pdfjs-distnpm install pdfjs-dist安装。

问题

我似乎无法让TypeScript编译我的项目。我使用的源代码直接从DefinitelyTyped的测试中复制。这是我试图编译的简化(仅删除)代码(DefinitelyTyped的测试代码的精确副本也以相同的方式失败):

import { PDFJSStatic } from 'pdfjs-dist';
var PDFJS: PDFJSStatic;
PDFJS.getDocument('helloworld.pdf').then(console.log);

TypeScript找到类型声明模块,并认为PDFJSStatic的导入是有效的。它认为PDFJS从未初始化过,但如果我在tsconfig中关闭strict,代码会编译,但它会编译为:

"use strict";
exports.__esModule = true;
var PDFJS;
PDFJS.getDocument('helloworld.pdf').then(console.log);

很明显这行不通。它不会将import语句编译成任何东西。

问题

如何将PDF.JS导入到TypeScript项目中,并通过@types/pdfjs-dist中的声明文件将其编译为工作的Node.JS代码?

我所尝试的

我在import上尝试了不同的变体,都没有用。切换到require似乎也没有帮助。
我已经验证了pdjs-dist依赖项和@types/pdfjs-dist依赖项是存在的,更新的,并且可以直接从NodeJS(非TypeScript程序)使用。
我在tsconfig中尝试了module的各种值。他们有时会更改生成的代码,但没有一个更改它以包含所需的导入。
我尝试在import行上方添加/// <reference path="../node_modules/@types/pdfjs-dist/index.d.ts" />。这并没有改变行为。

环境

tsc版本2.4.2、节点8.5和npm 5.3。我的项目根目录中有以下tsconfig.json

{
    "compilerOptions": {
        "allowJs":true,
        "rootDir": ".",
        "outDir": "dist",
        "moduleResolution": "node"
    },
     "include": [
        "src/**/*"
    ],
    "exclude": [
        "**/*.spec.ts",
        "dist/**/*"
    ]
}
xa9qqrwz

xa9qqrwz1#

也许你可以使用require函数。
添加@types/node包,并在源代码的顶部编写require('pdfjs-dist')。你可以像下面这样修改代码。
现在,这个代码将工作。

import { PDFJSStatic } from 'pdfjs-dist';
const PDFJS: PDFJSStatic = require('pdfjs-dist');
PDFJS.getDocument('helloworld.pdf').then(console.log);

我认为@types/pdfjs-dist在实现上有问题。

yduiuuwa

yduiuuwa2#

对于@types/pdfjs-dist 2.1.0和pdfjs-dist“2.1.266”,基本问题似乎还没有完全解决,但我发现their own test的方法是可行的:

import { getDocument, PDFDocumentProxy, PDFPromise, Util } from 'pdfjs-dist';

(It不过,这并不美观,因为它会污染您的名称空间。)

ttp71kqs

ttp71kqs3#

我也试过不同的方法。对我来说,最具可读性的是这一条:

import * as pdfjslib from 'pdfjs-dist';
let PDFJS = pdfjslib.PDFJS;
PDFJS.disableTextLayer = true;
PDFJS.disableWorker = true;
fzsnzjdm

fzsnzjdm4#

这对我来说很有效,而不必使用require

import * as pdfjslib from "pdfjs-dist";
const PDFJS = (<any>pdfjslib) as PDFJSStatic;

您只需将模块强制转换为any来消除类型错误。
@types/pdfjs-dist中的输入肯定是不正确的,但这应该是一个快速的解决方案。:)

z0qdvdin

z0qdvdin5#

如果你碰巧正在使用React,你可以使用react-pdf包,它在后台使用pdfjs。它也有自己的类型,所以你可以导入它,而不需要require

9ceoxa92

9ceoxa926#

以下作品。

  • pdfjs-dist v3.5.141
  • typescript v3.9.10
import * as pdfjsLib from 'pdfjs-dist/webpack'

...

    // in this example, data is a Uint8Array
    const pdf = await pdfjsLib.getDocument({ data }).promise
    for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {
      const page = await pdf.getPage(pageNum)
      ...

另外,使用一个文件“pdfjs-dist.d.ts”也没什么坏处:

declare module 'pdfjs-dist/webpack'

相关问题