114 lines
4.4 KiB
JavaScript
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();
|
|
|