使用nodejs输出著作权申请所需的word版源码

使用nodejs输出著作权申请所需的word版源码

背景

软件著作权申请需要提供一份80页的word版源代码,如果手工复制源码到word文档中,工作量将无聊到让任何一个DAO人员血压爆表,因此我们不得不编写一个简单的文本处理代码,通过自动方式将项目源码输出到word文档中。

实现逻辑

指定一个代码目录,通过递归扫描该目录及其所有子级目录下的文件(可指定文件类型),然后按行读取文件中的代码,输出到word文档中。

实现代码

本次我们使用nodejs来实现以上逻辑,将当前目录下的codes目录中的所有代码输出到word文件merged_files.docx中。

javascript 复制代码
const fs = require('fs-extra');
const path = require('path');
const readline = require('readline');
const docx = require("docx");

const graphs = [];

async function readFileContent(filePath) {
  return fs.readFile(filePath, 'utf8');
}

function createParagraph(text) {
  const paragraph = new docx.Paragraph({ children: [new docx.TextRun(text)] });
  graphs.push(paragraph);
}

function readLineContent(fullPath) {
  return new Promise((resolve, reject) => {
    const readStream = fs.createReadStream(fullPath);
    const rl = readline.createInterface({
      input: readStream,
      crlfDelay: Infinity
    });
  
    rl.on('line', (line) => {
      // console.log('Line from file:', line);
      createParagraph(line);
    });

    rl.on('close', () => {
      resolve();
    });
  });
}


async function convertDirectoryToDocx(directoryPath) {
  try {
    const files = await fs.readdir(directoryPath, { withFileTypes: true });

    for (const file of files) {
      const fullPath = path.join(directoryPath, file.name);
      if (file.isDirectory()) {
        await convertDirectoryToDocx(fullPath); // 递归处理子目录
      } else {
        await readLineContent(fullPath);
        // 添加空行
        createParagraph('                 ');
        createParagraph('                 ');
        createParagraph('                 ');
        createParagraph('                 ');
        createParagraph('                 ');
      }
    }

  } catch (err) {
    console.error(`读取目录出错: ${directoryPath}`, err);
  }
}

async function createDocx() {
  const inputDir = './codes'; // 输入目录路径

  await convertDirectoryToDocx(inputDir);
  
  const doc = new docx.Document({
    sections: [
        {
            properties: {},
            children: graphs,
        },
    ],
  });
  
  const outputDocx = './merged_files.docx'; // 输出的.docx文件路径
  
  docx.Packer.toBuffer(doc).then((buffer) => {
    fs.writeFileSync(outputDocx, buffer);
    console.log(`文件已合并至: ${outputDocx}`);
  });
}


createDocx();
相关推荐
林开落L2 分钟前
库制作与原理(下)
linux·开发语言·centos·库制作与原理
fengfuyao98532 分钟前
基于MATLAB的GUI实现人脸检测、眼睛检测以及LBP直方图显示
开发语言·计算机视觉·matlab
刘永胜是我44 分钟前
node版本切换
前端·node.js
CHANG_THE_WORLD1 小时前
# C++ 中的 `string_view` 和 `span`:现代安全视图指南
开发语言·c++
Franklin1 小时前
Python界面设计【QT-creator基础编程 - 01】如何让不同分辨率图像自动匹配graphicsView的窗口大小
开发语言·python·qt
郝学胜-神的一滴1 小时前
深入理解QFlags:Qt中的位标志管理工具
开发语言·c++·qt·程序人生
柯南二号2 小时前
【Java后端】MyBatis-Plus 原理解析
java·开发语言·mybatis
我是哈哈hh3 小时前
【Node.js】ECMAScript标准 以及 npm安装
开发语言·前端·javascript·node.js
HWL56793 小时前
pnpm(Performant npm)的安装
前端·vue.js·npm·node.js
Sammyyyyy4 小时前
2025年,Javascript后端应该用 Bun、Node.js 还是 Deno?
开发语言·javascript·node.js