支持Unicode的JavaScript生成PDF库

9

我想使用JavaScript在客户端生成PDF文件。首先我尝试使用jsPdf API,但它不支持像中文这样的Unicode字符。

是否有任何选项可以增强jspdf以支持Unicode或支持Unicode的其他库。

Pdfmake API声称支持Unicode,但当我尝试在其中示例示例中添加Unicode字符时,也无法正常工作。

我尝试在Node.js中使用pdfkit,但是PDF文件无法正确创建。

var PDFDocument = require("pdfkit");
var fs = require('fs');

var doc = new PDFDocument;

doc.pipe(fs.createWriteStream('output.pdf'));

doc.fontSize(15);
doc.text('Generate PDF! 漢字漢字漢字漢字');

doc.end();

在PDF中,它被创建为“生成PDF!”o"[Wo"[Wo"[Wo"[W

另外,我能否在pdfMake中添加多种字体?

 var fontDescriptors = {
    Roboto: {
      normal: 'examples/fonts/Roboto-Regular.ttf',
      bold: 'examples/fonts/Roboto-Medium.ttf',
      italics: 'examples/fonts/Roboto-Italic.ttf',
      bolditalics: 'examples/fonts/Roboto-Italic.ttf'
    }
  };

  var printer = new pdfMakePrinter(fontDescriptors);

有没有任何选项可以增强jspdf以支持Unicode或任何其他支持Unicode的库?当然有 - https://github.com/MrRio/jsPDF#contributing。它是开源的,所以您可以通过该更改为其做出贡献。 - llamerr
你尝试过在这两个项目中检查是否存在问题,并在没有问题的情况下创建一个吗? - llamerr
我还没有尝试创建任何新的库,而是在尝试查找是否已经存在任何库来解决我的问题。@llamerr - Sumeet Kumar Yadav
1个回答

10
我将使用Node.js和PDFKit来描述一种方案,因为你提到了它,但这也适用于内部使用PDFKitpdfmake
大多数情况下,这些库中使用的默认字体不支持中文字符。您必须添加和使用与您需要支持的语言兼容的字体。以pdfmake为例,他们使用Roboto作为默认字体,它确实不接受中文字符。
使用您的代码示例,我们可以添加对中文的支持,只需添加一行代码即可使用Microsoft YaHei字体(msyh.ttf)。
var PDFDocument = require("pdfkit");
var fs = require('fs');

var doc = new PDFDocument;

doc.pipe(fs.createWriteStream('output.pdf'));

doc.font('fonts/msyh.ttf');
doc.fontSize(15);
doc.text('Generate PDF! 漢字漢字漢字漢字');

doc.end();

输出将如下所示:

PDF Output


内置字体仅支持WinANSI编码,因此您确实需要添加字体。诀窍在于您可以添加多个字体或甚至是字体子集。由于大多数字体仅涵盖UTF-8的100,000多种脚本和符号集的子集,因此您需要确定确切需要什么,并找到覆盖您需求的一个或多个字体。 - HiDeoo
好的,我在谷歌搜索支持中文的字体中随机选择了一个字体作为示例^^您需要检查是否可以找到支持您所有需求的字体,如果没有,那应该是另一个问题,因为它超出了原始问题的范围。您还应该检查Google Noto字体,这是一个旨在支持所有语言的字体系列,您可以在此字体中精确选择所需内容。 - HiDeoo
我接受你的解决方案,你做得很好!只是在寻找更好的解决方案。 - Sumeet Kumar Yadav
我能在pdfMake中添加多个字体吗?我正在尝试同时添加noto-fonts和noto-ckj字体。 - Sumeet Kumar Yadav
是的,如果您查看pdfmake的文档如何使用自定义字体,当您创建新的vfs_fonts.js时,它会包含来自examples/fonts的所有文件/字体,因此您可以按照指定的要求在此处添加它们。 - HiDeoo
显示剩余5条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接