1

私はpdfmakeに問題があります。node.js サーバーで PDF を生成したいと考えています。データベースからデータをロードし、素敵なテーブルを描画して、単純にフォルダーに保存したいと思います。

var pdfMakePrinter = require('pdfmake/src/printer');
    ...

      var fonts = {
        Roboto: {
            normal: './fonts/Roboto-Regular.ttf',
            bold: './fonts/Roboto-Medium.ttf',
            italics: './fonts/Roboto-Italic.ttf',
            bolditalics: './fonts/Roboto-Italic.ttf'
        }
    };
    var PdfPrinter = require('pdfmake/src/printer');
    var printer = new PdfPrinter(fonts);

    var docDefinition = {
        content: [
            'First paragraph',
            'Another paragraph, this time a little bit longer to make sure, this line will be divided into at least two lines'
        ]
    };

    var pdfDoc = printer.createPdfKitDocument(docDefinition);
    pdfDoc.pipe(fs.createWriteStream('pdf/basics.pdf')).on('finish', function () {
        res.send(true);
    });

生成された PDF は空です。画像を追加すると、うまく挿入されます。ただし、フォントは含まれていません。(サンプルで指定されている) フォントのパスは正しいです。

フォントが埋め込まれていない理由と、node.jsでこれを行う方法を知っている人はいますか? pdfmake ドキュメントに有効なサンプルはありません。

いくつかのデバッグの後、アプリが次の関数の fontWrapper.js でクラッシュすることがわかりました。

FontWrapper.prototype.getFont = function(index){
    if(!this.pdfFonts[index]){

        var pseudoName = this.name + index;

        if(this.postscriptName){
            delete this.pdfkitDoc._fontFamilies[this.postscriptName];
        }

        this.pdfFonts[index] = this.pdfkitDoc.font(this.path, pseudoName)._font; <-- Crash
        if(!this.postscriptName){
            this.postscriptName = this.pdfFonts[index].name;
        }

        }

        return this.pdfFonts[index];
    };

誰にもアイデアはありますか?

4

1 に答える 1

2

あなたの場合、TTFは問題ではありません。任意のフォントを使用して、node.jsサーバーでPDFを生成できます。

pdfmakeの内部

TTFFont.open = function(filename, name) {
      var contents;
      contents = fs.readFileSync(filename);
      return new TTFFont(contents, name);
    };

contents = fs.readFileSync(filename);この行 でfsは、指定されたパスのファイルを読み取ることができません

この会話に従って、フォントをルートフォルダーに配置する必要がありますが、問題は、フォントオブジェクトを作成するときにルートパスを指定し、このパスがfs.readFileSyncこの行に対して機能しないため、フォントの正確なパスを指定する必要があることです

process.cwd().split('.meteor')[0]フォントパスの前に追加

同じ機能の例を作成しました。この下のリンクを参照してください

https://github.com/daupawar/MeteorAsyncPdfmake

于 2016-06-15T05:27:00.630 に答える