diff --git a/src/api.js b/src/api.js index 25dd14d8a..f4e27db80 100644 --- a/src/api.js +++ b/src/api.js @@ -298,7 +298,7 @@ var PDFPageProxy = (function PDFPageProxyClosure() { } var gfx = new CanvasGraphics(params.canvasContext, this.commonObjs, - this.objs, !this.pageInfo.disableTextLayer && params.textLayer); + this.objs, params.textLayer); try { this.display(gfx, params.viewport, complete, continueCallback); } catch (e) { diff --git a/src/core.js b/src/core.js index 7a883195a..c8c59016e 100644 --- a/src/core.js +++ b/src/core.js @@ -538,8 +538,10 @@ var PDFDocument = (function PDFDocumentClosure() { return shadow(this, 'numPages', num); }, getDocumentInfo: function PDFDocument_getDocumentInfo() { + var encrypt = this.xref.encrypt; var docInfo = { PDFFormatVersion: this.pdfFormatVersion, + IsTextCopyDisabled: encrypt ? encrypt.disableTextCopy : false, IsAcroFormPresent: !!this.acroForm }; if (this.xref.trailer.has('Info')) { diff --git a/src/crypto.js b/src/crypto.js index 70c4ccfe8..37e26b1fa 100644 --- a/src/crypto.js +++ b/src/crypto.js @@ -561,7 +561,7 @@ var CipherTransformFactory = (function CipherTransformFactoryClosure() { var ownerPassword = stringToBytes(dict.get('O')); var userPassword = stringToBytes(dict.get('U')); var flags = dict.get('P'); - this.disableTextLayer = !(flags & 16); + this.disableTextCopy = !(flags & 16); var revision = dict.get('R'); var encryptMetadata = algorithm == 4 && // meaningful when V is 4 dict.get('EncryptMetadata') !== false; // makes true as default value diff --git a/src/worker.js b/src/worker.js index 1c8241c6c..133af8850 100644 --- a/src/worker.js +++ b/src/worker.js @@ -214,13 +214,11 @@ var WorkerMessageHandler = { handler.on('GetPageRequest', function wphSetupGetPage(data) { var pageNumber = data.pageIndex + 1; var pdfPage = pdfModel.getPage(pageNumber); - var encrypt = pdfModel.xref.encrypt; var page = { pageIndex: data.pageIndex, rotate: pdfPage.rotate, ref: pdfPage.ref, - view: pdfPage.view, - disableTextLayer: encrypt ? encrypt.disableTextLayer : false + view: pdfPage.view }; handler.send('GetPage', {pageInfo: page}); }); diff --git a/web/viewer.css b/web/viewer.css index 0a034e2a7..c093aaaea 100644 --- a/web/viewer.css +++ b/web/viewer.css @@ -1198,6 +1198,14 @@ canvas { background-color: rgba(0, 100, 0, 0.2); } +#viewerContainer.copy-protection .textLayer > div { + visibility: hidden; +} + +#viewerContainer.copy-protection .textLayer > div > .highlight { + visibility: visible; +} + /* TODO: file FF bug to support ::-moz-selection:window-inactive so we can override the opaque grey background when the window is inactive; see https://bugzilla.mozilla.org/show_bug.cgi?id=706209 */ diff --git a/web/viewer.js b/web/viewer.js index 7192c14aa..40824b681 100644 --- a/web/viewer.js +++ b/web/viewer.js @@ -1350,6 +1350,14 @@ var PDFView = { // AcroForm/XFA was found PDFView.fallback(); } + + if (info.IsTextCopyDisabled) { + document.getElementById('viewerContainer').classList + .add('copy-protection'); + } else { + document.getElementById('viewerContainer').classList + .remove('copy-protection'); + } }); },