使用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();
相关推荐
qq_1728055917 小时前
Go 自建库的使用教程与测试
开发语言·后端·golang
久绊A18 小时前
Hydra-SSH 破解安全防范
开发语言·php
阿昭L18 小时前
c++中获取随机数
开发语言·c++
3壹18 小时前
数据结构精讲:栈与队列实战指南
c语言·开发语言·数据结构·c++·算法
悟乙己18 小时前
使用 Python 中的强化学习最大化简单 RAG 性能
开发语言·python·agent·rag·n8n
max50060018 小时前
图像处理:实现多图点重叠效果
开发语言·图像处理·人工智能·python·深度学习·音视频
dasseinzumtode18 小时前
nestJS 使用ExcelJS 实现数据的excel导出功能
前端·后端·node.js
RickyWasYoung19 小时前
【代码】matlab-遗传算法工具箱
开发语言·matlab
土了个豆子的20 小时前
03.缓存池
开发语言·前端·缓存·visualstudio·c#
_extraordinary_20 小时前
Java 多线程(一)
java·开发语言