我注意到您的项目引用了1.x
. 我建议您应该将依赖项更新为2.x
(我一次又一次地尝试,但在使用版本时失败1.x
):
"dependencies": {
"jsreport-assets": "^1.0.1",
"jsreport-chrome-pdf": "^1.1.5",
"jsreport-core": "^2.2.0",
"jsreport-express": "^2.2.2",
"jsreport-jsrender": "^2.0.0",
"jsreport-phantom-pdf": "^2.1.3",
"jsreport-scripts": "^2.0.6",
"jsreport-templates": "^2.0.0",
"puppeteer": "^1.8.0"
}
我不确定幻影配方中是否存在错误。但是,适用于 chrome 和 html 的相同代码在 phantom 上不起作用。所以我添加了一个食谱chrome-pdf
:
const options = {
tasks: {strategy: 'in-process'},
autoTempCleanup: false,
}
const jsreport = require('jsreport-core')(options)
.use(require('jsreport-templates')())
.use(require('jsreport-jsrender')())
.use(require('jsreport-scripts')())
.use(require('jsreport-phantom-pdf')({ }))
.use(require('jsreport-chrome-pdf')({ }))
.use(require('jsreport-assets')({
allowedFiles: "**/*.*",
searchOnDiskIfNotFoundInStore: true,
}))
;
现在我们可以添加字体和资产配置。
var myfont={
"name": "myfont.woff2",
"link": "wwwroot/jsreport-assets/fonts/myfont.woff2"
}
jsreport.init()
.then(async(reporter) => {
var assets=reporter.documentStore.collection("assets");
await assets.insert(myfont);
return reporter;
})
.then(reporter => reporter.render({
template: {
content: data,
engine: 'jsrender',
recipe: 'chrome-pdf',
chrome: {
format: 'A4',
margin: { top: 0, right: 0, bottom: 0, left: 0 },
orientation: "landscape"
}
},
data: { }
})).then((resp) => {
callback(null, resp.content.toJSON().data);
}).catch(e=>callback(e,null));
最后,我们现在可以嵌入 base64 编码字体:
@@font-face {
font-family: 'MyFont';
font-weight: 10000;
font-style: italic;
src: url('{#asset myfont.woff2 @@encoding=dataURI}') format('woff2');
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02BB-02BC, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
* {
font-family: 'MyFont';
}
我在这里使用 double @
,因为您将首先获得由 Razor 渲染的模板。
这是它有效的屏幕截图: