diff --git a/src/display/api.js b/src/display/api.js index a27a2b500..2cf8f9ad2 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -743,8 +743,10 @@ class PDFDocumentProxy { } /** + * NOTE: This is (mostly) intended to support printing of XFA forms. + * * @type {Object | null} An object representing a HTML tree structure - * to render the XFA, or `null` when no XFA form exists. + * to render the XFA, or `null` when no XFA form exists. */ get allXfaHtml() { return this._transport._htmlForXfa; diff --git a/src/display/display_utils.js b/src/display/display_utils.js index fbf9a5e69..e4cc62085 100644 --- a/src/display/display_utils.js +++ b/src/display/display_utils.js @@ -606,6 +606,20 @@ class PDFDateString { } } +/** + * NOTE: This is (mostly) intended to support printing of XFA forms. + */ +function getXfaPageViewport(xfaPage, { scale = 1, rotation = 0 }) { + const { width, height } = xfaPage.attributes.style; + const viewBox = [0, 0, parseInt(width), parseInt(height)]; + + return new PageViewport({ + viewBox, + scale, + rotation, + }); +} + export { addLinkAttributes, DEFAULT_LINK_REL, @@ -616,6 +630,7 @@ export { DOMSVGFactory, getFilenameFromUrl, getPdfFilenameFromUrl, + getXfaPageViewport, isDataScheme, isPdfFile, isValidFetchUrl, diff --git a/src/display/xfa_layer.js b/src/display/xfa_layer.js index 5b3e16005..cd068b92d 100644 --- a/src/display/xfa_layer.js +++ b/src/display/xfa_layer.js @@ -13,8 +13,6 @@ * limitations under the License. */ -import { PageViewport } from "./display_utils.js"; - class XfaLayer { static setupStorage(html, fieldId, element, storage, intent) { const storedData = storage.getValue(fieldId, { value: null }); @@ -134,13 +132,8 @@ class XfaLayer { const rootDiv = parameters.div; rootDiv.appendChild(rootHtml); - - let { viewport } = parameters; - if (!(viewport instanceof PageViewport)) { - viewport = new PageViewport(viewport); - } - const coeffs = viewport.transform.join(","); - rootDiv.style.transform = `matrix(${coeffs})`; + const transform = `matrix(${parameters.viewport.transform.join(",")})`; + rootDiv.style.transform = transform; // Set defaults. rootDiv.setAttribute("class", "xfaLayer xfaFont"); diff --git a/src/pdf.js b/src/pdf.js index b5d4d38d1..9a1bfce30 100644 --- a/src/pdf.js +++ b/src/pdf.js @@ -18,6 +18,7 @@ import { addLinkAttributes, getFilenameFromUrl, getPdfFilenameFromUrl, + getXfaPageViewport, isPdfFile, isValidFetchUrl, LinkTarget, @@ -108,6 +109,7 @@ export { loadScript, PDFDateString, RenderingCancelledException, + getXfaPageViewport, // From "./display/api.js": build, getDocument, diff --git a/web/print_utils.js b/web/print_utils.js index 50725fa99..3c1d8c85f 100644 --- a/web/print_utils.js +++ b/web/print_utils.js @@ -15,26 +15,26 @@ import { CSS_UNITS } from "./ui_utils.js"; import { DefaultXfaLayerFactory } from "./xfa_layer_builder.js"; +import { getXfaPageViewport } from "pdfjs-lib"; function getXfaHtmlForPrinting(printContainer, pdfDocument) { const xfaHtml = pdfDocument.allXfaHtml; const factory = new DefaultXfaLayerFactory(); const scale = Math.round(CSS_UNITS * 100) / 100; + for (const xfaPage of xfaHtml.children) { const page = document.createElement("div"); page.className = "xfaPrintedPage"; printContainer.appendChild(page); - const { width, height } = xfaPage.attributes.style; - const viewBox = [0, 0, parseInt(width), parseInt(height)]; - const viewport = { viewBox, scale, rotation: 0 }; - const builder = factory.createXfaLayerBuilder( /* pageDiv = */ page, /* pdfPage = */ null, /* annotationStorage = */ pdfDocument.annotationStorage, /* xfaHtml = */ xfaPage ); + const viewport = getXfaPageViewport(xfaPage, { scale }); + builder.render(viewport, "print"); } } diff --git a/web/xfa_layer_builder.js b/web/xfa_layer_builder.js index 43ffbe917..17f891c19 100644 --- a/web/xfa_layer_builder.js +++ b/web/xfa_layer_builder.js @@ -44,9 +44,8 @@ class XfaLayerBuilder { */ render(viewport, intent = "display") { if (intent === "print") { - viewport.dontFlip = true; const parameters = { - viewport, + viewport: viewport.clone({ dontFlip: true }), div: this.div, xfa: this.xfaHtml, page: null, @@ -76,6 +75,7 @@ class XfaLayerBuilder { xfa, page: this.pdfPage, annotationStorage: this.annotationStorage, + intent, }; if (this.div) {