UNPKG

pdfjs-vue-print

Version:

Example Vue 3 project using pdf.js to build a simple custom PDF.js viewer and print service.

274 lines (242 loc) 5.42 kB
/* Copyright 2016 Mozilla Foundation * Copyright 2022 Drew Letcher * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ :root { --progressBar-percent: 0%; } * { padding: 0; margin: 0; } header { background-color: rgba(244, 244, 244, 1); } header h1 { border-bottom: 1px solid rgba(216, 216, 216, 1); color: rgba(133, 133, 133, 1); font-size: 23px; font-style: italic; font-weight: normal; overflow: hidden; padding: 10px; text-align: center; text-overflow: ellipsis; white-space: nowrap; } section { position: absolute; top: 0; left: 0; width: 100%; height: 100%; overflow: hidden; font-size: 2rem; } footer { background-image: url(../assets/images/toolbar_background.png); height: 4rem; position: absolute; bottom: 0; left: 0; right: 0; z-index: 1; box-shadow: 0 -0.2rem 0.5rem rgba(50, 50, 50, 0.75); } #viewerContainer { position: absolute; overflow: auto; width: 100%; height: 100%; top: 5rem; bottom: 4rem; left: 0; right: 0; } canvas { margin: auto; display: block; } .hidden { display: none; } [hidden] { display: none !important; } @page { margin: 0; } #printServiceDialog { position: absolute; top: 30%; left: 40%; padding: 20px; border-radius: 10px; } .dialogButton { width: auto; margin: 3px 4px 2px !important; padding: 2px 11px; border-radius: 6px; } #printContainer { display: none; } @media print { body { background: rgba(0, 0, 0, 0) none; } body[data-pdfjsprinting] #outerContainer { display: none; } body[data-pdfjsprinting] #printContainer { display: block; } #printContainer { height: 100%; } /* wrapper around (scaled) print canvas elements */ #printContainer > .printedPage { page-break-after: always; page-break-inside: avoid; /* The wrapper always cover the whole page. */ height: 100%; width: 100%; display: flex; flex-direction: column; justify-content: center; align-items: center; } #printContainer > .xfaPrintedPage .xfaPage { position: absolute; } #printContainer > .xfaPrintedPage { page-break-after: always; page-break-inside: avoid; width: 100%; height: 100%; position: relative; } #printContainer > .printedPage canvas, #printContainer > .printedPage img { /* The intrinsic canvas / image size will make sure that we fit the page. */ max-width: 100%; max-height: 100%; direction: ltr; display: block; } } #pageNumber { -moz-appearance: textfield; /* hides the spinner in moz */ position: absolute; width: 28%; height: 100%; left: 36%; text-align: center; border: 0; background-color: rgba(0, 0, 0, 0); font-size: 1.2rem; color: rgba(255, 255, 255, 1); background-image: url(../assets/images/div_line_left.png), url(../assets/images/div_line_right.png); background-repeat: no-repeat; background-position: left, right; background-size: 0.2rem, 0.2rem; } .pdfViewer .page .loadingIcon { width: 2.9rem; height: 2.9rem; background: url(../assets/images/spinner.png) no-repeat left top / 38rem; border: medium none; animation: 1s steps(10, end) 0s normal none infinite moveDefault; display: block; position: absolute; top: calc((100% - 2.9rem) / 2); left: calc((100% - 2.9rem) / 2); } @keyframes moveDefault { from { background-position: 0 top; } to { background-position: -39rem top; } } #loadingBar { position: relative; height: 0.6rem; background-color: rgba(51, 51, 51, 1); border-bottom: 1px solid rgba(51, 51, 51, 1); } #loadingBar .progress { position: absolute; left: 0; width: 100%; transform: scaleX(var(--progressBar-percent)); transform-origin: 0 0; height: 100%; background-color: rgba(221, 221, 221, 1); overflow: hidden; transition: transform 200ms; } @keyframes progressIndeterminate { 0% { transform: translateX(0%); } 50% { transform: translateX(100%); } 100% { transform: translateX(100%); } } #loadingBar.indeterminate .progress { transform: none; background-color: rgba(153, 153, 153, 1); transition: none; } #loadingBar.indeterminate .progress .glimmer { position: absolute; top: 0; left: 0; height: 100%; width: 5rem; background-image: linear-gradient( to right, rgba(153, 153, 153, 1) 0%, rgba(255, 255, 255, 1) 50%, rgba(153, 153, 153, 1) 100% ); background-size: 100% 100%; background-repeat: no-repeat; animation: progressIndeterminate 2s linear infinite; } #errorWrapper { background: none repeat scroll 0 0 rgba(255, 85, 85, 1); color: rgba(255, 255, 255, 1); left: 0; position: absolute; right: 0; top: 3.2rem; z-index: 1000; padding: 0.3rem; font-size: 0.8em; } #errorMoreInfo { background-color: rgba(255, 255, 255, 1); color: rgba(0, 0, 0, 1); padding: 0.3rem; margin: 0.3rem; width: 98%; }