Nodejs Pdfkit生成pdf遇到中文乱码求解

Nodejs Pdfkit生成pdf遇到中文乱码求解

用pdfkit生成pdf,用的字库是wqy-zenhei.ttf,都是中文的时候没啥事,有中文有英文数字的时候好像就会字叠在一块儿。

有没有哪位用过这个并显示中文的? 求解。 另外字库有没有更好用的? 用windows系统里面的simsun.ttf会报错,“No unicode cmap for font”。

2 回复

Node.js Pdfkit生成PDF遇到中文乱码求解

在使用 pdfkit 库生成PDF文件时,如果需要包含中文字符,可能会遇到中文乱码或者文字重叠的问题。以下是一个示例,展示如何正确地将中英文混合文本写入PDF文件。

解决方案

  1. 选择合适的字体文件:确保你使用的字体文件支持中文字符。
  2. 嵌入字体文件:将字体文件嵌入到PDF文档中。
  3. 设置字体:在生成PDF时设置正确的字体。

示例代码

const fs = require('fs');
const PDFDocument = require('pdfkit');

// 创建一个新的PDF文档
const doc = new PDFDocument();

// 将PDF内容输出到文件
doc.pipe(fs.createWriteStream('output.pdf'));

// 嵌入字体文件
const fontPath = './path/to/your/font/simhei.ttf'; // 确保路径正确
doc.font(fontPath);

// 添加内容
doc.fontSize(25).text('Hello World', { align: 'center' });
doc.fontSize(18).text('你好,世界!', { align: 'center' });

// 结束PDF文档
doc.end();

注意事项

  1. 字体文件路径:确保 fontPath 路径指向的是一个有效的 .ttf 文件,并且该字体文件支持中文字符。
  2. 字体嵌入:通过 doc.font(fontPath) 方法可以将字体文件嵌入到PDF文档中。这样可以避免字体缺失导致的文字乱码问题。
  3. 错误处理:如果你使用 simsun.ttf 字体时报错 “No unicode cmap for font”,这可能是因为该字体不完全支持Unicode字符集。建议使用其他支持Unicode字符集的字体文件。

其他字体推荐

  • SimHei:黑体,支持简体中文。
  • Songti SC:宋体,支持简体中文。
  • Noto Sans CJK:一种跨平台的字体,支持多种东亚语言。

总结

通过正确地选择和嵌入字体文件,可以有效解决使用 pdfkit 生成PDF时出现的中文乱码或文字重叠问题。希望上述示例代码能够帮助你解决问题。


在使用 pdfkit 生成包含中文的 PDF 文件时,可能会遇到中文乱码或重叠的问题。这是因为 pdfkit 默认使用的字体不支持中文字符。你需要指定一个支持中文的字体文件,如 wqy-zenhei.ttfsimsun.ttf

示例代码

以下是一个简单的示例代码,展示如何使用 wqy-zenhei.ttf 字体文件来生成包含中文的 PDF:

const PDFDocument = require('pdfkit');
const fs = require('fs');

// 创建一个新的PDF文档
let doc = new PDFDocument({
    size: 'A4',
    layout: 'portrait'
});

// 输出流
let writeStream = fs.createWriteStream('output.pdf');

// 将输出流附加到PDF文档
doc.pipe(writeStream);

// 添加字体
doc.font('./path/to/wqy-zenhei.ttf');

// 添加内容
doc.fontSize(16);
doc.text('Hello, 中文! This is a test.');
doc.text('This is another line with 中文.');

// 结束PDF文档
doc.end();

解释

  1. 引入依赖

    • 引入 pdfkitfs(文件系统)模块。
  2. 创建PDF文档

    • 使用 new PDFDocument() 创建一个新的PDF文档实例。
  3. 创建输出流

    • 使用 fs.createWriteStream() 创建一个写入流,用于将PDF文档写入到文件中。
  4. 指定字体

    • 使用 doc.font() 方法指定一个支持中文的字体文件路径(例如 wqy-zenhei.ttf)。
  5. 添加内容

    • 使用 doc.text() 方法向PDF文档中添加文本内容。你可以指定字体大小和其他样式。
  6. 结束文档

    • 使用 doc.end() 方法结束PDF文档的生成。

常见问题

  • 乱码:确保指定的字体文件路径正确,并且字体文件确实支持中文字符。
  • 重叠:确保没有重复调用 doc.font() 方法,否则可能导致字体设置混乱。
  • No unicode cmap for font:这通常是因为字体文件本身不支持Unicode字符映射。尝试使用其他字体文件,如 wqy-zenhei.ttf

希望这些信息能帮助你解决中文乱码问题。如果还有其他问题,请随时提问。

回到顶部