web-dev-qa-db-ja.com

動作するNode.JSコードを生成する方法でTypeScriptにPDF.jsNPMモジュールと@typesバインディングをロードさせるにはどうすればよいですか?

コンテキスト

PDF.JS をTypeScriptプロジェクトにインポートしようとしています。 pdfjs-distおよびnpm install @types/pdfjs-distを介してインストールされたDefinitelyTyped bindings for npm install pdfjs-dist を使用しています。

問題

TypeScriptでプロジェクトをコンパイルできないようです。 DefinitelyTypedのテストから直接コピーしたソースコードを使用しています。これは私がコンパイルしようとしている単純化された(削除のみ)コードです(DefinitelyTypedからのテストコードの正確なコピーも同じように失敗します):

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

TypeScriptは型宣言モジュールを見つけ、PDFJSStaticのインポートが有効であると見なします。 PDFJSが初期化されるとは思われませんが、stricttsconfigをオフにすると、コードはコンパイルされますが、次のようにコンパイルされます。

"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、およびnpm5.3。プロジェクトルートに次のtsconfig.jsonがあります。

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

多分あなたは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_の実装には問題があると思います。

7
Azoson

私もさまざまな方法を試しました。私にとって、最も読みやすいのはこれでした:

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

@types/pdfjs-dist2.1.0およびpdfjs-dist "2.1.266"、根本的な問題はまだ完全には修正されていないようですが、 独自のテスト からのアプローチが機能することがわかりました:

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

(ただし、名前空間を汚染するため、きれいではありません。)

1
Sören Kuklau

これは、requireを使用せずに、私にとってはうまくいきました。

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

モジュールをanyにキャストして、タイプエラーを沈黙させる必要があります。

@ types/pdfjs-distでの入力は間違いなく間違っていますが、これは簡単な回避策です。 :)

0
Peter Fernandes