如何用Nodejs把word转成pdf?

如何用Nodejs把word转成pdf?

如题,求助各位,如果有类似经历的希望不吝分享一下。

目前的解决方案是分别生成pdf和word,内容一样,但是实际显示还是有区别。 word用的是officegen,pdf用的pdfkit,pdfkit用的字库还不是宋体的,找了一个黑体的支持Unicode的,宋体支持Unicode的字体(ttf文件)还没找到。

4 回复

要将Word文档转换为PDF,可以使用Node.js中的多种工具和库。以下是一种常见的方法,使用docxtemplater来处理Word文档,并结合pdfmake生成PDF文件。

解决方案概述

  1. 安装必要的依赖:我们将使用docxtemplater来读取和解析Word文档,然后使用pdfmake将其转换为PDF格式。

  2. 创建一个简单的Word模板:首先,我们需要一个Word文档作为模板。

  3. 读取并处理Word文档:使用docxtemplater读取Word文档,并替换其中的占位符。

  4. 将处理后的文档转换为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.');
    });
});

解释

  1. 加载Word模板:我们使用PizZipUtils加载Word模板文件,并将其传递给docxtemplater进行处理。

  2. 渲染Word文档:使用doc.render()方法替换Word文档中的占位符。

  3. 转换为PDF:通过pdfmake将处理后的Word文档内容转换为PDF格式。

请注意,上述代码假设你有一个名为template.docx的Word模板文件,并且该文件中包含一个名为{{name}}的占位符。此外,你需要提供适当的字体文件路径。

这种方法虽然不是直接将Word文档转换为PDF,但通过中间步骤处理文档内容,最终实现了Word到PDF的转换。


http://cnodejs.org/topic/53d8e325bd3cc3e50b082d04 上次看到这个帖子,你可以问下他

请问最终解决没有呢。我用的https://github.com/gfloyd/node-unoconv 这个npm包转换出来的字体大小有问题,想请教一下您那边有没有其他的方法,谢谢了

要将Word文档转换为PDF格式,可以使用一些成熟的第三方库和工具来实现。一个常见的方法是先将Word文档转换为HTML或中间文本格式,然后再使用相应的库将其转换为PDF。

以下是一个基本的解决方案,使用mammoth库将Word文档转换为HTML,然后使用html-pdf库将HTML转换为PDF:

  1. 首先安装所需的库:
npm install mammoth html-pdf
  1. 使用以下示例代码将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文件。

注意事项

  1. 确保安装了所需的依赖项。
  2. 如果需要更复杂的样式和格式,可能需要对HTML进行额外处理。
  3. 对于复杂的文档结构,可能需要更高级的转换工具,例如使用Microsoft Office API或其他专业的转换服务。

这种方法虽然不是最完美的解决方案,但可以在一定程度上满足需求,并且易于实现。

回到顶部