PDFMAKE:仅在 GULP 之后才在虚拟文件系统中找不到“Roboto-Regular.ttf”

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

我使用 knockout/bootstrap/gulp 创建了一个简单的应用程序,它使用 pdfMake.js 下载 pdf。使用 VS2017 在调试模式下工作正常。发布并使用 gulp 后,运行时会出现此错误:在虚拟文件系统中找不到文件“Roboto-Regular.ttf”

注意:gulp之后,所有JS文件都在一个script.js文件中。

我尝试了很多东西,它在调试时总是有效,只要我运行 gulp,它就会给出错误。

我从here尝试了joepal1976的解决方案(我对require.config.js中的依赖项做了什么)

有人建议 .pipe(uglify({ 压缩:{ hoist_funs:假 } })) 这似乎没有帮助。

包含在 require.config 中,如下所示:

var require = {
    baseUrl: ".",
    paths: {
        "jquery":               "js-libs/jquery.min",
        "bootstrap":            "js-libs/bootstrap.min",
        "crossroads":           "js-libs/crossroads.min",
        "hasher":               "js-libs/hasher.min",
        "knockout":             "js-libs/knockout",
        "knockout-projections": "js-libs/knockout-projections.min",
        "signals":              "js-libs/signals.min",
        "text":                 "js-libs/text",
        "vfs_fonts":            "js-libs/vfs_fonts",
        "pdfMake":              "js-libs/pdfmake.min"
    },
    shim: {
        "bootstrap": { deps: ["jquery"] },
        'pdfMake':
        {
            exports: 'vfs_fonts'
        },
        'vfs_fonts':
        {
            deps: ['pdfMake'],
            exports: 'vfs_fonts'
        }
    }
};

页面的JS:

define(["knockout", "text!./home.html"], function (ko, homeTemplate) {
function HomeViewModel(route) {
    var thisVM = this;


    this.VMInit = function () {

        var thePDF = {
            content: [
                'My test invoice.',
            ]
        };

        pdfMake.createPdf(thePDF).download('pdf_test.pdf');

    }

    thisVM.VMInit();
}
return { viewModel: HomeViewModel, template: homeTemplate };

});

Gulp 文件:

//-----------------------------------------------------------------------
// Node modules
var fs      = require('fs'),
vm      = require('vm'),
merge   = require('deeply'),
chalk   = require('chalk'),
es      = require('event-stream');

//-----------------------------------------------------------------------
// Gulp and plugins
var gulp        = require('gulp'),
rjs         = require('gulp-requirejs-bundler'),
concat      = require('gulp-concat'),
clean       = require('gulp-clean'),
replace     = require('gulp-replace'),
uglify      = require('gulp-uglify'),
htmlreplace = require('gulp-html-replace');

// Config
var requireJsRuntimeConfig = 
vm.runInNewContext(fs.readFileSync('src/app/require.config.js') + '; require;');
requireJsOptimizerConfig = merge(requireJsRuntimeConfig, {
    out: 'scripts.js',
    baseUrl: './src',
    name: 'app/startup',
    paths: {
        requireLib: 'js-libs/require'
    },
    include: [
        'requireLib',
        'components/nav-bar/nav-bar',
        'components/home-page/home',
        'text!components/about-page/about.html'
    ],
    insertRequire: ['app/startup'],
    bundles: {
        // If you want parts of the site to load on demand, remove them from the 'include' list
        // above, and group them into bundles here.
        // 'bundle-name': [ 'some/module', 'another/module' ],
        // 'another-bundle-name': [ 'yet-another-module' ]
    }
});

//-----------------------------------------------------------------------
// Discovers all AMD dependencies, concatenates together all required .js 
files, minifies them
gulp.task('js', function () {
    return rjs(requireJsOptimizerConfig)
        .pipe(replace('Views/src/', ''))
        .pipe(replace('img/', 'Assets/img/'))
        .pipe(replace('css/', 'Assets/css/'))
        .pipe(uglify({
            preserveComments: 'some'
        }))
        .pipe(gulp.dest('./dist-app/Assets/js/'));
});


gulp.task('css', function () {
return gulp.src(['./src/css/bootstrap.css',
                 './src/css/bootstrap-switch.css',
                 './src/css/dataTables.bootstrap.css',
                 './src/css/dataTables.colVis.css',
                 './src/css/dataTables.responsive.css',
                 './src/css/daterangePicker.css'])
    .pipe(concat('styles.css'))
    .pipe(gulp.dest('./dist-app/Assets/css/'));
});


// Copies index.html, replacing <script> and <link> tags to reference production 
URLs
gulp.task('html', function () {
return gulp.src('./src/index.html')
    .pipe(htmlreplace({
        dependencies_top: '<link href="Assets/css/styles.css" 
rel="stylesheet">',
        dependencies_bottom: '<script src="Assets/js/scripts.js"></script>'
    }))
    .pipe(gulp.dest('./dist-app/'));
});



// Removes all files from ./dist/
gulp.task('clean', function () {
console.log("the clean task");
return gulp.src('./dist-app/**/*', { read: false })
    .pipe(clean());
});

// All tasks in [] must complete before 'default' can begin
gulp.task('default', ['html', 'js', 'css'], function (callback) {
callback();
console.log('\nPlaced optimized files in ' + chalk.magenta('dist-app/\n'));
});

Startup.js 文件(如果有帮助):

define(['jquery',
    'knockout',
    './router',
    'bootstrap',
    'knockout-projections',
    'pdfMake',
    'vfs_fonts'], function ($, ko, router) {

// Components can be packaged as AMD modules, such as the following:
ko.components.register('nav-bar', { require: 'components/nav-bar/nav-bar' });
ko.components.register('home-page', { require: 'components/home-page/home' 
});

// ... or for template-only components, you can just point to a .html file 
directly:
ko.components.register('about-page', {
template: { require: 'text!components/about-page/about.html' }
});

ko.components.register('new-page', { require: 'components/new-page/new-page' 
});

// [Scaffolded component registrations will be inserted here. To retain this 
//feature, don't remove this comment.]

// Start the application
ko.applyBindings({ route: router.currentRoute });
});
javascript knockout.js gulp require pdfmake
6个回答
51
投票

以下代码对我有用:

import pdfMake from "pdfmake/build/pdfmake";
import pdfFonts from "pdfmake/build/vfs_fonts";
pdfMake.vfs = pdfFonts.pdfMake.vfs;

17
投票

我最近在 stackblitz 上与 Angular 一起使用它时遇到了这个问题。问题是窗口对象上的 pdfmake.vfs 未设置。所以我必须像这样在我的 pdf 服务的构造函数中手动设置它。

  constructor() {
    (window as any).pdfMake.vfs = pdfFonts.pdfMake.vfs;
  }

14
投票

我遇到了这个问题,并通过在 pdfmake Javascript 文件后面添加

vfs_fonts.js
来解决它。

这是我的代码,您只需将文件路径设置为放置文件副本的位置即可。

<script src="~/Content/DataTables/pdfmake-0.1.32/pdfmake.min.js"></script>
<script src="~/Content/DataTables/pdfmake-0.1.32/vfs_fonts.js"></script>

CDN 链接

<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.53/pdfmake.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.32/vfs_fonts.js"></script>

请遵循链接的层次结构/依赖关系,否则它将不起作用


3
投票

这只是文件的顺序,添加 first pdfmakethen vfs_fonts


0
投票

@Rijo 解决方案在一个文件中工作,但奇怪的是拒绝在另一个文件中工作。

在另一个文件中我必须使用:

import pdfMake from "pdfmake/build/pdfmake";
import pdfFonts from "pdfmake/build/vfs_fonts";

// Wherever you call createPdf, you have to pass VFS
pdfMake.createPdf(docDefinition, null, null, pdfFonts.pdfMake.vfs).open();

0
投票

在 ReactJs 中使用此字体脚本:

import pdfMake from "pdfmake/build/pdfmake.min";

pdfMake.fonts = {
    Roboto: {
      normal: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Regular.ttf',
      bold: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Medium.ttf',
      italics: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-Italic.ttf',
      bolditalics: 'https://cdnjs.cloudflare.com/ajax/libs/pdfmake/0.1.66/fonts/Roboto/Roboto-MediumItalic.ttf'
    }
 }
© www.soinside.com 2019 - 2024. All rights reserved.