Skip to content
This repository was archived by the owner on May 30, 2023. It is now read-only.

Commit a638a07

Browse files
committed
js-ify, rename and extend print-margins property
Now the left/top/right/bottom print margins can be set separately using the pageSize.margin property. You can either use pageSize.margin = "10px" or use a map to set the margins separately: pageSize.margin = { left: "10px", top: "5cm", right: "7in", bottom: "13mm" }; pageSize.border is now a synonym for pageSize.margin to keep compatibility to existing scripts. ISSUE: 388 (http://code.google.com/p/phantomjs/issues/detail?id=388)
1 parent b224feb commit a638a07

3 files changed

Lines changed: 75 additions & 14 deletions

File tree

examples/printmargins.js

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
var page = require('webpage').create();
2+
3+
if (phantom.args.length < 6) {
4+
console.log('Usage: printmargins.js URL filename LEFT TOP RIGHT BOTTOM');
5+
console.log(' margin examples: "1cm", "10px", "7mm", "5in"');
6+
phantom.exit();
7+
} else {
8+
var address = phantom.args[0];
9+
var output = phantom.args[1];
10+
var marginLeft = phantom.args[2];
11+
var marginTop = phantom.args[3];
12+
var marginRight = phantom.args[4];
13+
var marginBottom = phantom.args[5];
14+
page.viewportSize = { width: 600, height: 600 };
15+
page.paperSize = {
16+
format: 'A4',
17+
margin: {
18+
left: marginLeft,
19+
top: marginTop,
20+
right: marginRight,
21+
bottom: marginBottom
22+
}
23+
};
24+
page.open(address, function (status) {
25+
if (status !== 'success') {
26+
console.log('Unable to load the address!');
27+
} else {
28+
window.setTimeout(function () {
29+
page.render(output);
30+
phantom.exit();
31+
}, 200);
32+
}
33+
});
34+
}

examples/rasterize.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@ if (phantom.args.length < 2 || phantom.args.length > 3) {
1111
page.viewportSize = { width: 600, height: 600 };
1212
if (phantom.args.length === 3 && phantom.args[1].substr(-4) === ".pdf") {
1313
size = phantom.args[2].split('*');
14-
page.paperSize = size.length === 2 ? { width: size[0], height: size[1], border: '0px' }
15-
: { format: phantom.args[2], orientation: 'portrait', border: '1cm' };
14+
page.paperSize = size.length === 2 ? { width: size[0], height: size[1], margin: '0px' }
15+
: { format: phantom.args[2], orientation: 'portrait', margin: '1cm' };
1616
}
1717
page.open(address, function (status) {
1818
if (status !== 'success') {

src/webpage.cpp

Lines changed: 39 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -453,6 +453,16 @@ qreal stringToPointSize(const QString &string)
453453
return 0;
454454
}
455455

456+
qreal printMargin(const QVariantMap &map, const QString &key)
457+
{
458+
const QVariant margin = map.value(key);
459+
if (margin.isValid() && margin.canConvert(QVariant::String)) {
460+
return stringToPointSize(margin.toString());
461+
} else {
462+
return 0;
463+
}
464+
}
465+
456466
bool WebPage::renderPdf(const QString &fileName)
457467
{
458468
QPrinter printer;
@@ -465,7 +475,7 @@ bool WebPage::renderPdf(const QString &fileName)
465475
const QSize pageSize = m_mainFrame->contentsSize();
466476
paperSize.insert("width", QString::number(pageSize.width()) + "px");
467477
paperSize.insert("height", QString::number(pageSize.height()) + "px");
468-
paperSize.insert("border", "0px");
478+
paperSize.insert("margin", "0px");
469479
}
470480

471481
if (paperSize.contains("width") && paperSize.contains("height")) {
@@ -523,17 +533,34 @@ bool WebPage::renderPdf(const QString &fileName)
523533
return false;
524534
}
525535

526-
const qreal border = paperSize.contains("border") ?
527-
floor(stringToPointSize(paperSize.value("border").toString())) : 0;
528-
const qreal borderBottom = paperSize.contains("borderBottom") ?
529-
floor(stringToPointSize(paperSize.value("borderBottom").toString())) : border;
530-
const qreal borderTop = paperSize.contains("borderTop") ?
531-
floor(stringToPointSize(paperSize.value("borderTop").toString())) : border;
532-
const qreal borderLeft = paperSize.contains("borderLeft") ?
533-
floor(stringToPointSize(paperSize.value("borderLeft").toString())) : border;
534-
const qreal borderRight = paperSize.contains("borderRight") ?
535-
floor(stringToPointSize(paperSize.value("borderRight").toString())) : border;
536-
printer.setPageMargins(borderLeft, borderTop, borderRight, borderBottom, QPrinter::Point);
536+
if (paperSize.contains("border") && !paperSize.contains("margin")) {
537+
// backwards compatibility
538+
paperSize["margin"] = paperSize["border"];
539+
}
540+
541+
qreal marginLeft = 0;
542+
qreal marginTop = 0;
543+
qreal marginRight = 0;
544+
qreal marginBottom = 0;
545+
546+
if (paperSize.contains("margin")) {
547+
const QVariant margins = paperSize["margin"];
548+
if (margins.canConvert(QVariant::Map)) {
549+
const QVariantMap map = margins.toMap();
550+
marginLeft = printMargin(map, "left");
551+
marginTop = printMargin(map, "top");
552+
marginRight = printMargin(map, "right");
553+
marginBottom = printMargin(map, "bottom");
554+
} else if (margins.canConvert(QVariant::String)) {
555+
const qreal margin = stringToPointSize(margins.toString());
556+
marginLeft = margin;
557+
marginTop = margin;
558+
marginRight = margin;
559+
marginBottom = margin;
560+
}
561+
}
562+
563+
printer.setPageMargins(marginLeft, marginTop, marginRight, marginBottom, QPrinter::Point);
537564

538565
m_mainFrame->print(&printer);
539566
return true;

0 commit comments

Comments
 (0)