diff --git a/examples/printmargins.js b/examples/printmargins.js new file mode 100644 index 00000000..99c9adf2 --- /dev/null +++ b/examples/printmargins.js @@ -0,0 +1,34 @@ +var page = require('webpage').create(); + +if (phantom.args.length < 6) { + console.log('Usage: printmargins.js URL filename LEFT TOP RIGHT BOTTOM'); + console.log(' margin examples: "1cm", "10px", "7mm", "5in"'); + phantom.exit(); +} else { + var address = phantom.args[0]; + var output = phantom.args[1]; + var marginLeft = phantom.args[2]; + var marginTop = phantom.args[3]; + var marginRight = phantom.args[4]; + var marginBottom = phantom.args[5]; + page.viewportSize = { width: 600, height: 600 }; + page.paperSize = { + format: 'A4', + margin: { + left: marginLeft, + top: marginTop, + right: marginRight, + bottom: marginBottom + } + }; + page.open(address, function (status) { + if (status !== 'success') { + console.log('Unable to load the address!'); + } else { + window.setTimeout(function () { + page.render(output); + phantom.exit(); + }, 200); + } + }); +} diff --git a/examples/rasterize.js b/examples/rasterize.js index fcd74cdd..44341fc1 100644 --- a/examples/rasterize.js +++ b/examples/rasterize.js @@ -11,8 +11,8 @@ if (phantom.args.length < 2 || phantom.args.length > 3) { page.viewportSize = { width: 600, height: 600 }; if (phantom.args.length === 3 && phantom.args[1].substr(-4) === ".pdf") { size = phantom.args[2].split('*'); - page.paperSize = size.length === 2 ? { width: size[0], height: size[1], border: '0px' } - : { format: phantom.args[2], orientation: 'portrait', border: '1cm' }; + page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: '0px' } + : { format: phantom.args[2], orientation: 'portrait', margin: '1cm' }; } page.open(address, function (status) { if (status !== 'success') { diff --git a/src/webpage.cpp b/src/webpage.cpp index 861877e1..a77d029b 100644 --- a/src/webpage.cpp +++ b/src/webpage.cpp @@ -467,6 +467,16 @@ qreal stringToPointSize(const QString &string) return 0; } +qreal printMargin(const QVariantMap &map, const QString &key) +{ + const QVariant margin = map.value(key); + if (margin.isValid() && margin.canConvert(QVariant::String)) { + return stringToPointSize(margin.toString()); + } else { + return 0; + } +} + bool WebPage::renderPdf(const QString &fileName) { QPrinter printer; @@ -479,7 +489,7 @@ bool WebPage::renderPdf(const QString &fileName) const QSize pageSize = m_mainFrame->contentsSize(); paperSize.insert("width", QString::number(pageSize.width()) + "px"); paperSize.insert("height", QString::number(pageSize.height()) + "px"); - paperSize.insert("border", "0px"); + paperSize.insert("margin", "0px"); } if (paperSize.contains("width") && paperSize.contains("height")) { @@ -537,9 +547,34 @@ bool WebPage::renderPdf(const QString &fileName) return false; } - const qreal border = paperSize.contains("border") ? - floor(stringToPointSize(paperSize.value("border").toString())) : 0; - printer.setPageMargins(border, border, border, border, QPrinter::Point); + if (paperSize.contains("border") && !paperSize.contains("margin")) { + // backwards compatibility + paperSize["margin"] = paperSize["border"]; + } + + qreal marginLeft = 0; + qreal marginTop = 0; + qreal marginRight = 0; + qreal marginBottom = 0; + + if (paperSize.contains("margin")) { + const QVariant margins = paperSize["margin"]; + if (margins.canConvert(QVariant::Map)) { + const QVariantMap map = margins.toMap(); + marginLeft = printMargin(map, "left"); + marginTop = printMargin(map, "top"); + marginRight = printMargin(map, "right"); + marginBottom = printMargin(map, "bottom"); + } else if (margins.canConvert(QVariant::String)) { + const qreal margin = stringToPointSize(margins.toString()); + marginLeft = margin; + marginTop = margin; + marginRight = margin; + marginBottom = margin; + } + } + + printer.setPageMargins(marginLeft, marginTop, marginRight, marginBottom, QPrinter::Point); m_mainFrame->print(&printer); return true;