如何用Nodejs把word转成pdf?
如何用Nodejs把word转成pdf?
如题,求助各位,如果有类似经历的希望不吝分享一下。
目前的解决方案是分别生成pdf和word,内容一样,但是实际显示还是有区别。 word用的是officegen,pdf用的pdfkit,pdfkit用的字库还不是宋体的,找了一个黑体的支持Unicode的,宋体支持Unicode的字体(ttf文件)还没找到。
要将Word文档转换为PDF,可以使用Node.js中的多种工具和库。以下是一种常见的方法,使用docxtemplater
来处理Word文档,并结合pdfmake
生成PDF文件。
解决方案概述
-
安装必要的依赖:我们将使用
docxtemplater
来读取和解析Word文档,然后使用pdfmake
将其转换为PDF格式。 -
创建一个简单的Word模板:首先,我们需要一个Word文档作为模板。
-
读取并处理Word文档:使用
docxtemplater
读取Word文档,并替换其中的占位符。 -
将处理后的文档转换为PDF:使用
pdfmake
将处理后的文档内容转换为PDF格式。
示例代码
安装依赖
首先,确保你已经安装了Node.js环境。然后,在你的项目目录中安装所需的依赖:
npm install docxtemplater pizzip pizzip-utils pdfmake fontkit
创建Word模板
创建一个名为template.docx
的Word文档,并包含一些占位符,例如{{name}}
。
转换代码
const fs = require('fs');
const path = require('path');
const PizZip = require('pizzip');
const Docxtemplater = require('docxtemplater');
const PdfMake = require('pdfmake');
const PizZipUtils = require('pizzip/utils/index.js');
// 加载Word模板
function loadFile(url, callback) {
PizZipUtils.getBinaryContent(url, callback);
}
loadFile('./template.docx', function(error, content) {
if (error) { throw error; }
const zip = new PizZip(content);
const doc = new Docxtemplater(zip, {
paragraphLoop: true,
linebreaks: true,
});
// 替换占位符
doc.render({
name: 'John Doe'
});
const buf = doc.getZip().generate({ type: 'nodebuffer' });
// 将Word文档转换为PDF
const fonts = {
Roboto: {
normal: path.join(__dirname, 'Roboto-Regular.ttf'),
bold: path.join(__dirname, 'Roboto-Medium.ttf'),
italics: path.join(__dirname, 'Roboto-Italic.ttf'),
bolditalics: path.join(__dirname, 'Roboto-MediumItalic.ttf')
}
};
const pdfMake = new PdfMake(fonts);
const pdfDoc = pdfMake.createPdf(doc);
pdfDoc.write('output.pdf', function() {
console.log('PDF created successfully.');
});
});
解释
-
加载Word模板:我们使用
PizZipUtils
加载Word模板文件,并将其传递给docxtemplater
进行处理。 -
渲染Word文档:使用
doc.render()
方法替换Word文档中的占位符。 -
转换为PDF:通过
pdfmake
将处理后的Word文档内容转换为PDF格式。
请注意,上述代码假设你有一个名为template.docx
的Word模板文件,并且该文件中包含一个名为{{name}}
的占位符。此外,你需要提供适当的字体文件路径。
这种方法虽然不是直接将Word文档转换为PDF,但通过中间步骤处理文档内容,最终实现了Word到PDF的转换。
请问最终解决没有呢。我用的https://github.com/gfloyd/node-unoconv 这个npm包转换出来的字体大小有问题,想请教一下您那边有没有其他的方法,谢谢了
要将Word文档转换为PDF格式,可以使用一些成熟的第三方库和工具来实现。一个常见的方法是先将Word文档转换为HTML或中间文本格式,然后再使用相应的库将其转换为PDF。
以下是一个基本的解决方案,使用mammoth
库将Word文档转换为HTML,然后使用html-pdf
库将HTML转换为PDF:
- 首先安装所需的库:
npm install mammoth html-pdf
- 使用以下示例代码将Word文档转换为PDF:
const mammoth = require('mammoth');
const pdf = require('html-pdf');
async function convertDocxToPdf(docxFilePath, pdfFilePath) {
try {
// 将Word文档转换为HTML
const result = await mammoth.convertToHtml({ path: docxFilePath });
const html = result.value;
// 将HTML转换为PDF
pdf.create(html).toFile(pdfFilePath, (err, res) => {
if (err) return console.log(err);
console.log(res); // { filename: '/app/business.pdf' }
});
} catch (error) {
console.error("Error:", error);
}
}
// 使用方法
convertDocxToPdf('example.docx', 'output.pdf').then(() => {
console.log('Conversion completed.');
});
解释
mammoth.convertToHtml
:将Word文档(.docx
格式)转换为HTML字符串。pdf.create(html).toFile(pdfFilePath)
:将生成的HTML字符串转换为PDF文件。
注意事项
- 确保安装了所需的依赖项。
- 如果需要更复杂的样式和格式,可能需要对HTML进行额外处理。
- 对于复杂的文档结构,可能需要更高级的转换工具,例如使用Microsoft Office API或其他专业的转换服务。
这种方法虽然不是最完美的解决方案,但可以在一定程度上满足需求,并且易于实现。