【发布时间】:2015-03-02 09:24:47
【问题描述】:
我正在使用 HTML 模板生成 PDF 的服务器端,该模板使用来自客户端和服务器的数据完成。下面的代码有效,但是:
1) PDF 文件比在客户端“另存为 PDF”时大 5 倍。
2) PDF 不可搜索。
我假设这两个问题都源于 PhantomJS 生成基于光栅与矢量的 PDF。我应该做些什么不同(希望我只是缺少一个或两个 PhantomJS 选项......)??
var phantom = require('phantom');
req.body['invoicenumber'] = 15010001;
phantom.create(function(ph){
ph.createPage(function(page) {
page.set('paperSize', { format: 'Letter',orientation: 'portrait', margin: '1cm' });
page.open("html/template.html", function(status) {
page.evaluate(function(data) {
$(function() { populate(data); });
},function() {
var quotenumber
page.render('quotes/'+req.body['invoicenumber']+'.pdf', function(){
ph.exit();
res.send(req.body['invoicenumber']+'.pdf');
});
},req.body);
});
});
})
次要更新:增加页边距以使页面不放大会减小文件大小,但仍然是客户端“另存为 PDF”的 2.5 倍...
【问题讨论】:
-
为了可搜索,必须将文本制作为文本,而不是图像,而不是矢量图形(即轮廓文本)。
-
过去我扫描文档时,使用“光栅到矢量”来创建可搜索的文档。如果在这种情况下“大纲文本”是正确的术语,我会更正。
-
事实上,如果您将其称为“光栅到矢量”,它会创建可搜索的文本,那么一切都很好。在这种情况下,转换器实际上做了 OCR(光学字符识别),而这正是我们所需要的。 OCR 创建文本,而“简单”矢量化所做的只是将形状转换为轮廓矢量对象,如果发生这种情况,您就有矢量,但文本尚未被识别为这样。换句话说,没有必要觉得自己被纠正了……
-
为什么不将页面保存为
html,然后才将其转换为pdf? (例如html2pdf) -
如果可能的话,我会考虑改用 wkhtmltopdf,因为就我的经验而言,它可以生成迄今为止我测试过的工具中最小的 pdf。我没用过,但是有一个Node.is wrapper for wkhtmltopdf。输出包含实际文本,而不是光栅/矢量输出。由于它基于 webkit,因此可以在渲染之前运行 Javascript 来修改(以及几乎可以在浏览器中执行的任何操作)html。我没有添加它作为答案,因为它不使用 PhantomJS。