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/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..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; @@ -949,12 +957,30 @@ 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 pagesOverview = 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, + }; + }); + 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, + }; }); }, };