使用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();
相关推荐
君鼎26 分钟前
IO复用详解——C/C++
开发语言·c++
Clown9530 分钟前
go-zero(十八)结合Elasticsearch实现高效数据检索
开发语言·elasticsearch·golang
愚润求学30 分钟前
【Linux】动静态库的使用
linux·运维·服务器·开发语言·c++·笔记
写代码写到手抽筋41 分钟前
C++性能优化之访存优化(未完)
开发语言·c++
Dovis(誓平步青云)1 小时前
基于面向对象设计的C++日期推算引擎:精准高效的时间运算实现与运算重载工程化实践
开发语言·c++·经验分享·笔记
夜晚中的人海1 小时前
【C语言】初阶数据结构相关习题(二)
c语言·开发语言·数据结构
武昌库里写JAVA1 小时前
MacOS Python3安装
java·开发语言·spring boot·学习·课程设计
Dxy12393102161 小时前
python如何设置excel单元格边框样式
开发语言·python·excel
低代码布道师1 小时前
第五部分:第二节 - Node.js 核心模块:厨房里的基本工具
node.js
chaodaibing2 小时前
Python解析Excel入库如何做到行的拆分
开发语言·python·excel