Files
js-scripts/scripts/markdownpdf.js
2025-04-05 16:57:26 +08:00

114 lines
4.4 KiB
JavaScript

#! /usr/bin/env runjs
// http://wkhtmltopdf.org/downloads.html
// $ wkhtmltopdf --user-style-sheet scripts/for-pdf.css --header-left "Hatter's Test Document - v1.0"
// --header-right '[page]/[toPage]' --header-line --margin-top 2.3cm --header-spacing 8 --header-font-size 10
// --footer-line --footer-font-name 'Times New Roman' --footer-font-size 10 --footer-spacing 8 --margin-bottom 2.3cm
// --footer-center 'Copyright © 2017 Hatter Jiang. All Rights Reserved.' --debug-javascript test.htm test.pdf
requireJAR('markdown4j-2.2.jar');
var File = java.io.File;
var RFile = Packages.me.hatter.tools.commons.io.RFile;
var StringUtil = Packages.me.hatter.tools.commons.string.StringUtil;
var Markdown4jProcessor = Packages.org.markdown4j.Markdown4jProcessor;
var main = () => {
var whichResults = $$.shell().commands('which', 'wkhtmltopdf').start();
if (!whichResults[0].toString().contains('wkhtmltopdf')) {
println('[ERROR] `wkhtmltopdf` must be installed <http://wkhtmltopdf.org/downloads.html>')
return;
}
if ($ARGS == null || $ARGS.length == 0) {
println('markdownpdf.js - Render markdown to pdf.')
println();
println('ERROR: NO arguments assigned!');
println('markdownpdf.js filename.md [filename.pdf]');
return;
}
var mdFile = $$.file($ARGS[0]);
if (!mdFile.exists()) {
println('[ERROR] File not exists: ' + $ARGS[0]);
return;
}
var pdfFile = ($ARGS.length > 1)? $ARGS[1]: (StringUtil.substringBeforeLast(mdFile.getName(), '.') || mdFile.getName()) + '.pdf';
var defaultMarkdownpdfConfig = {
"header-left": "Sample Document - v1.0",
"header-right": "[page]/[toPage]",
"header-line": true,
"margin-top": "2.3cm",
"header-spacing": "8",
"header-font-size": "10",
"footer-line": true,
"footer-font-name": "Times New Roman",
"footer-font-size": "10",
"footer-spacing": "8",
"margin-bottom": "2.3cm",
"footer-center": "Copyright © 2017 Hatter Jiang. All Rights Reserved.",
"debug-javascript": true
//"user-style-sheet": "pdf.css"
};
var markdownpdfConfig = defaultMarkdownpdfConfig;
var fileMarkdownpdfConfig = $$.file('markdownpdf.json');
if (fileMarkdownpdfConfig.exists()) {
println('[INFO] Config file markdownpdf.json found, load config.');
markdownpdfConfig = JSON.parse(RFile.from(fileMarkdownpdfConfig).rReader().stringAndClose());
} else {
println('[INFO] Config file markdownpdf.json not found, load default config.');
}
var boolConfigKeys = $$.set();
boolConfigKeys.addAll($$.asList('header-line', 'footer-line', 'debug-javascript'));
var cmds = $$.list();
cmds.add('wkhtmltopdf');
["header-left", "header-right", "header-line", "margin-top", "header-spacing", "header-font-size", "footer-line",
"footer-font-name", "footer-font-size", "footer-spacing", "margin-bottom", "footer-center", "debug-javascript", "user-style-sheet"].forEach((k) => {
var conf = (markdownpdfConfig[k] == null)? defaultMarkdownpdfConfig[k]: markdownpdfConfig[k];
if (conf) {
cmds.add('--' + k);
if (!boolConfigKeys.contains(k)) {
cmds.add(conf);
}
}
});
println('[INFO] Render markdown file to temp html.')
var tempHtmlFile = File.createTempFile('markdowntopdf', '.html');
tempHtmlFile.deleteOnExit();
var md = RFile.from(mdFile).string();
var html = new Markdown4jProcessor().process(md);
html = '<html>\n'
+ '<head>\n'
+ '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">\n'
+ '<style>\n'
+ ' * {\n'
+ ' font-size: 60px;\n'
+ ' }\n'
+ '</style>\n'
+ '</head>\n'
+ '<body>\n\n\n' + html + '\n\n\n</body>\n'
+ '</html>\n';
RFile.from(tempHtmlFile).write(html);
cmds.add(tempHtmlFile.getAbsolutePath());
cmds.add(pdfFile);
println('[INFO] Execute command line: ' + cmds);
var result = $$.shell().commands(cmds.toArray(java.lang.reflect.Array.newInstance($$.clazz('java.lang.String'), 0))).start();
println('[INFO] Outputs: ')
if (result[1] && result[1].toString().trim().length > 0) {
println(result[1].toString().trim());
}
if (result[0].toString().trim().length > 0) {
println(result[0].toString().trim());
}
};
main();