Print.js
Print.js copied to clipboard
[Identified Bug][PDF display from blob fails] Invalid absolute docBaseUrl, blank PDF on Firefox aboveOrEqu to 110
Just opened a ticket on mozilla side since it affects developpeur edition only seems to. For anyone landing on this. https://bugzilla.mozilla.org/show_bug.cgi?id=1814029
Same behaviour also in latest non-developer version as well.
@Kwaadpepper @larminen
I tried debugging the Print.js locally and it seems that:
- It looks like this might not be a Firefox bug , but rather a Print.js bug
- The issue seems not to be related to the warnings printed in the console
Despite the warnings printed in the console in the test page printing
Warning: Invalid absolute docBaseUrl: "blob:http://localhost:8080/047308fc-b24a-44e0-9ce9-f9852f978320". pdf.worker.js:973:13
Warning: Bad value, for custom key "AAPL:Keywords", in Info: . pdf.worker.js:973:13
PDF 8eed11de459c2ed35fec410bf057a870 [1.3 Mac OS X 10.11.4 Quartz PDFContext / Word] (PDF.js: 3.3.56 [1e938a688]) viewer.js:2275:13
the pdf was sometimes printed when I paused for debugging and then resumed execution, so in principle Firefox 110 is able to render the pdf and print it.
Whenever I set a breakpoint on https://github.com/crabbly/Print.js/blob/6502c73c7e1ba87346fe4913fa5de6220936095b/src/js/print.js#L66 and stop and resume immediately when printing, then PDF is printed successfully in Firefox 110
I also found the following snippet where we wait for Firefox to print the pdf:
https://github.com/crabbly/Print.js/blob/6502c73c7e1ba87346fe4913fa5de6220936095b/src/js/print.js#L16-L18
So most likely the issue is that for some reason Firefox does not manage to render the iframe fully before we print the iframe's contentWindow
with performPrint
https://github.com/crabbly/Print.js/blob/6502c73c7e1ba87346fe4913fa5de6220936095b/src/js/print.js#L66
I then tried increasing the timeout to 2000 or 5000, but this did not help, pdf is still a blank page.
@Kwaadpepper @larminen
I guess the fix might be to allow the Firefox to render the iframe with the content we are about to print, but how to do it is a good question, apparently simply increasing the timeout to a larger value of 2000 or 5000 does not help. Will try to research a bit more and maybe @crabbly might be able to look and help here also
Seems that this special handling part for Firefox is now broken
https://github.com/crabbly/Print.js/blob/6502c73c7e1ba87346fe4913fa5de6220936095b/src/js/print.js#L71-L75
and commenting it out resolved the issue for Firefox 110.
So we could say that this issue is not a bug in Firefox and this fix would be to add a version number check on this if statement as of 110 ?
If this is confirmed I would close the bug thread in Firefox.
@mjp89 Good find, confirming for Firefox 110 that the following change fixes the bug and PDF is printed:
diff --git a/src/js/print.js b/src/js/print.js
index e09e69f..deee4ca 100644
--- a/src/js/print.js
+++ b/src/js/print.js
@@ -12,12 +12,7 @@ const Print = {
// Wait for iframe to load all content
iframeElement.onload = () => {
if (params.type === 'pdf') {
- // Add a delay for Firefox. In my tests, 1000ms was sufficient but 100ms was not
- if (Browser.isFirefox()) {
- setTimeout(() => performPrint(iframeElement, params), 1000)
- } else {
- performPrint(iframeElement, params)
- }
+ performPrint(iframeElement, params)
return
}
@@ -68,12 +63,6 @@ function performPrint (iframeElement, params) {
} catch (error) {
params.onError(error)
} finally {
- if (Browser.isFirefox()) {
- // Move the iframe element off-screen and make it invisible
- iframeElement.style.visibility = 'hidden'
- iframeElement.style.left = '-1px'
- }
-
cleanUp(params)
}
}
The PR/fix for Print.js should probably check the Firefox version in addition to only the browser name, for this we might use, for example https://www.npmjs.com/package/sniffr
@Kwaadpepper Yes, this is not a bug in Firefox but rather in Print.js, the bug thread in Firefox can be closed I think
I can try opening a PR a bit later in the evening but not sure how actively Print.js is currently maintained/whether the PR will be merged @crabbly
Opened the PR https://github.com/crabbly/Print.js/pull/657 which should fix the issue
Thanks @amoilanen for providing the fix 😺
For time being my team have added below code just for make it runnable:
const isFirefox = () => {
return typeof InstallTrigger !== 'undefined';
};
const getFirefoxMajorVersion = () => {
try {
const userAgent = navigator.userAgent;
const firefoxVersionRegex = /firefox\/(\S+)/;
const match = userAgent.toLowerCase().match(firefoxVersionRegex);
if (match) {
return match[1].split('.').map(x => parseInt(x))[0];
}
} catch {}
return null;
};
const customPrint = function (url) {
const iframe = document.createElement('iframe');
document.body.appendChild(iframe);
iframe.style.display = 'none';
iframe.src = url;
iframe.onload = function () {
iframe.focus();
iframe.contentWindow.print();
};
};
btnDefault.onclick = function () {
if (isFirefox() && getFirefoxMajorVersion() >= 110) {
customPrint('assets/file-lg.pdf');
} else {
printJS({ printable: 'assets/file-lg.pdf' });
}
};
@crabbly Thank you for reviewing and merging the fix https://github.com/crabbly/Print.js/pull/657, could you, please, also release it to https://www.npmjs.com/package/print-js to enable support for Firefox >=110 ?
Hi @amoilanen , will post an update here once the new version is up. Thank you 🙏🏻
Greetings, I ran into this issue today and found this thread. Any update on a this getting bumped into the new version? Thanks so much!
@crabbly When possible, could, you, please, release the fix? This might be a "blocker" with the latest Firefox for quite a few users, so your help will be very much appreciated 🙏🏻 Thank you
I don't mean to be rude in any way -- just checking to see if there is an update or if there's help needed to get this released? I'd happily volunteer time!
A bit off topic, but I'd like to point out that the way Firefox is detected is not sustainable. cf. https://github.com/crabbly/Print.js/blob/master/src/js/browser.js#L3
Why? Because InstallTrigger
will be removed in a future version of Firefox. See your DevTools console:
Good point. Still hoping we can get an immediate release with the patch/fix, though. Is this project dead?
Hi @crabbly any chances this gets released?