From 775441b7c69100e52578fbe48113e6c114066ada Mon Sep 17 00:00:00 2001 From: Rob Wu Date: Tue, 7 Feb 2017 23:38:23 +0100 Subject: [PATCH 1/2] Refactor: configurable page rotation in print job Determine the page rotation at the same place as where the page size is determined. This allows us to implement custom print page rotation logic in one place, in the future. --- web/firefox_print_service.js | 2 +- web/pdf_print_service.js | 2 +- web/pdf_viewer.js | 8 ++++++-- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/web/firefox_print_service.js b/web/firefox_print_service.js index a461ef09c..4d7b6efc9 100644 --- a/web/firefox_print_service.js +++ b/web/firefox_print_service.js @@ -61,7 +61,7 @@ var renderContext = { canvasContext: ctx, transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0], - viewport: pdfPage.getViewport(1), + viewport: pdfPage.getViewport(1, size.rotation), intent: 'print' }; return pdfPage.render(renderContext).promise; diff --git a/web/pdf_print_service.js b/web/pdf_print_service.js index 5cf2c64df..6e6b8da70 100644 --- a/web/pdf_print_service.js +++ b/web/pdf_print_service.js @@ -60,7 +60,7 @@ var renderContext = { canvasContext: ctx, transform: [PRINT_UNITS, 0, 0, PRINT_UNITS, 0, 0], - viewport: pdfPage.getViewport(1), + viewport: pdfPage.getViewport(1, size.rotation), intent: 'print' }; return pdfPage.render(renderContext).promise; diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js index 47797cccb..3fe031510 100644 --- a/web/pdf_viewer.js +++ b/web/pdf_viewer.js @@ -949,12 +949,16 @@ var PDFViewer = (function pdfViewer() { /** * Returns sizes of the pages. - * @returns {Array} Array of objects with width/height fields. + * @returns {Array} Array of objects with width/height/rotation fields. */ getPagesOverview: function () { return this._pages.map(function (pageView) { var viewport = pageView.pdfPage.getViewport(1); - return {width: viewport.width, height: viewport.height}; + return { + width: viewport.width, + height: viewport.height, + rotation: viewport.rotation, + }; }); }, }; From ece44d36e8ff9bc7469e0952e4707858f0427e3f Mon Sep 17 00:00:00 2001 From: Rob Wu Date: Wed, 8 Feb 2017 00:15:09 +0100 Subject: [PATCH 2/2] Allow automatic print rotation via enablePrintAutoRotate --- extensions/chromium/preferences_schema.json | 6 ++++++ web/app.js | 5 +++++ web/default_preferences.json | 1 + web/pdf_viewer.js | 24 ++++++++++++++++++++- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/extensions/chromium/preferences_schema.json b/extensions/chromium/preferences_schema.json index 43bd863d6..763387f0e 100644 --- a/extensions/chromium/preferences_schema.json +++ b/extensions/chromium/preferences_schema.json @@ -114,6 +114,12 @@ "renderInteractiveForms": { "type": "boolean", "default": false + }, + "enablePrintAutoRotate": { + "title": "Automatically rotate printed pages", + "description": "When enabled, pages whose orientation differ from the first page are rotated when printed.", + "type": "boolean", + "default": false } } } diff --git a/web/app.js b/web/app.js index f7e76b3e9..1a51ebc5e 100644 --- a/web/app.js +++ b/web/app.js @@ -190,6 +190,7 @@ var PDFViewerApplication = { renderer: 'canvas', enhanceTextSelection: false, renderInteractiveForms: false, + enablePrintAutoRotate: false, }, isViewerEmbedded: (window.parent !== window), url: '', @@ -304,6 +305,9 @@ var PDFViewerApplication = { Preferences.get('disablePageLabels').then(function resolved(value) { self.viewerPrefs['disablePageLabels'] = value; }), + Preferences.get('enablePrintAutoRotate').then(function resolved(value) { + self.viewerPrefs['enablePrintAutoRotate'] = value; + }), ]).catch(function (reason) { }); }, @@ -342,6 +346,7 @@ var PDFViewerApplication = { renderer: self.viewerPrefs['renderer'], enhanceTextSelection: self.viewerPrefs['enhanceTextSelection'], renderInteractiveForms: self.viewerPrefs['renderInteractiveForms'], + enablePrintAutoRotate: self.viewerPrefs['enablePrintAutoRotate'], }); pdfRenderingQueue.setViewer(self.pdfViewer); pdfLinkService.setViewer(self.pdfViewer); diff --git a/web/default_preferences.json b/web/default_preferences.json index 7e8114f31..dbb9dd5a5 100644 --- a/web/default_preferences.json +++ b/web/default_preferences.json @@ -15,5 +15,6 @@ "enhanceTextSelection": false, "renderer": "canvas", "renderInteractiveForms": false, + "enablePrintAutoRotate": false, "disablePageLabels": false } diff --git a/web/pdf_viewer.js b/web/pdf_viewer.js index 3fe031510..95bf67e5b 100644 --- a/web/pdf_viewer.js +++ b/web/pdf_viewer.js @@ -81,6 +81,9 @@ var DEFAULT_CACHE_SIZE = 10; * text selection behaviour. The default is `false`. * @property {boolean} renderInteractiveForms - (optional) Enables rendering of * interactive form elements. The default is `false`. + * @property {boolean} enablePrintAutoRotate - (optional) Enables automatic + * rotation of pages whose orientation differ from the first page upon + * printing. The default is `false`. * @property {string} renderer - 'canvas' or 'svg'. The default is 'canvas'. */ @@ -122,6 +125,10 @@ var PDFViewer = (function pdfViewer() { return false; } + function isPortraitOrientation(size) { + return size.width <= size.height; + } + /** * @constructs PDFViewer * @param {PDFViewerOptions} options @@ -135,6 +142,7 @@ var PDFViewer = (function pdfViewer() { this.removePageBorders = options.removePageBorders || false; this.enhanceTextSelection = options.enhanceTextSelection || false; this.renderInteractiveForms = options.renderInteractiveForms || false; + this.enablePrintAutoRotate = options.enablePrintAutoRotate || false; this.renderer = options.renderer || RendererType.CANVAS; this.defaultRenderingQueue = !options.renderingQueue; @@ -952,7 +960,7 @@ var PDFViewer = (function pdfViewer() { * @returns {Array} Array of objects with width/height/rotation fields. */ getPagesOverview: function () { - return this._pages.map(function (pageView) { + var pagesOverview = this._pages.map(function (pageView) { var viewport = pageView.pdfPage.getViewport(1); return { width: viewport.width, @@ -960,6 +968,20 @@ var PDFViewer = (function pdfViewer() { rotation: viewport.rotation, }; }); + if (!this.enablePrintAutoRotate) { + return pagesOverview; + } + var isFirstPagePortrait = isPortraitOrientation(pagesOverview[0]); + return pagesOverview.map(function (size) { + if (isFirstPagePortrait === isPortraitOrientation(size)) { + return size; + } + return { + width: size.height, + height: size.width, + rotation: (size.rotation + 90) % 360, + }; + }); }, };