Hugo站点PDF导出实现:如何将生成PDF存储至对应Markdown源文件所在目录
实现方案
你不需要额外用JSON存储路径映射,之前逻辑混乱的核心原因是把Tex统一存入独立文件夹时,丢失了和源Markdown文件的路径关联。现在只要在首次遍历到Markdown文件时就把后续所有生成文件的路径确定好,直接按顺序完成转换,就可以直接把PDF回存到源文件所在目录,完全避免跨文件夹存储的混乱问题。
具体操作步骤
- 第一步:引入Node.js内置的
path模块,用于规范处理路径,避免不同操作系统的路径分隔符兼容问题,代码开头加一行:const path = require('path') - 第二步:修改遍历逻辑,识别到Markdown文件时直接生成对应Tex、PDF的存储路径,修改后的完整代码如下:
const fs = require('fs') const path = require('path') const contentPath = "../../content" function inner (subPath){ const fullPath = path.join(contentPath, subPath) const is_path_a_folder = fs.existsSync(fullPath) && fs.lstatSync(fullPath).isDirectory() if (is_path_a_folder){ const directory = fs.readdirSync(fullPath) directory.forEach((subSubPath) => { inner(path.join(subPath, subSubPath)) }) } else if (fs.existsSync(fullPath)) { if (subPath.endsWith(".md")) { // 提取源文件的目录和文件名信息 const mdDir = path.dirname(fullPath) // 源md文件所在目录 const mdNameWithoutExt = path.basename(fullPath, '.md') // 源md文件名(不含后缀) // 直接生成同目录下的tex、PDF输出路径 const texOutputPath = path.join(mdDir, `${mdNameWithoutExt}.tex`) const pdfOutputPath = path.join(mdDir, `${mdNameWithoutExt}.pdf`) // 传入输出路径给转换函数 convertToTex(fullPath, texOutputPath) // 转换完tex后直接调用生成PDF的函数 convertTexToPdf(texOutputPath, pdfOutputPath) // 如果不需要保留中间tex文件,生成PDF后可以直接删除 // fs.unlinkSync(texOutputPath) } } } - 第三步:调整你的
convertToTex和convertTexToPdf函数入参,直接用上面传入的输出路径存储生成的文件即可,不需要再写死统一的输出文件夹。
可选操作(仅当你需要单独存储中间Tex文件时使用)
如果你确实有需求要把Tex文件统一存在单独的文件夹,才需要用到JSON存储路径映射,实现逻辑如下:
- 遍历前初始化空映射对象:
const pathMap = {} - 每次处理md文件时,把源md路径、tex存储路径、PDF存储路径存入映射:
pathMap[fullPath] = { texPath: texOutputPath, pdfPath: pdfOutputPath } - 所有文件遍历完成后,把映射写入JSON文件:
fs.writeFileSync('./path-map.json', JSON.stringify(pathMap, null, 2))
内容的提问来源于stack exchange,提问作者Rose Gnoccy
相关产品推荐
相关产品推荐

