diff --git a/src/display/display_utils.js b/src/display/display_utils.js index 459df1f7c..30964c9ab 100644 --- a/src/display/display_utils.js +++ b/src/display/display_utils.js @@ -49,6 +49,8 @@ class PixelsPerInch { * does the magic for us. */ class DOMFilterFactory extends BaseFilterFactory { + #baseUrl; + #_cache; #_defs; @@ -121,6 +123,25 @@ class DOMFilterFactory extends BaseFilterFactory { return [bufferR.join(","), bufferG.join(","), bufferB.join(",")]; } + #createUrl(id) { + if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) { + if (this.#baseUrl === undefined) { + const url = this.#document.URL; + if (url === this.#document.baseURI) { + // No ``-element present, hence a relative URL should work. + this.#baseUrl = ""; + } else if (isDataScheme(url)) { + warn('#createUrl: ignore "data:"-URL for performance reasons.'); + this.#baseUrl = ""; + } else { + this.#baseUrl = url.split("#", 1)[0]; + } + } + return `url(${this.#baseUrl}#${id})`; + } + return `url(${id})`; + } + addFilter(maps) { if (!maps) { return "none"; @@ -146,7 +167,7 @@ class DOMFilterFactory extends BaseFilterFactory { // https://www.w3.org/TR/SVG11/filters.html#feComponentTransferElement const id = `g_${this.#docId}_transfer_map_${this.#id++}`; - const url = `url(#${id})`; + const url = this.#createUrl(id); this.#cache.set(maps, url); this.#cache.set(key, url); @@ -232,7 +253,7 @@ class DOMFilterFactory extends BaseFilterFactory { filter ); - info.url = `url(#${id})`; + info.url = this.#createUrl(id); return info.url; } @@ -254,7 +275,7 @@ class DOMFilterFactory extends BaseFilterFactory { } const id = `g_${this.#docId}_alpha_map_${this.#id++}`; - const url = `url(#${id})`; + const url = this.#createUrl(id); this.#cache.set(map, url); this.#cache.set(key, url); @@ -287,7 +308,7 @@ class DOMFilterFactory extends BaseFilterFactory { } const id = `g_${this.#docId}_luminosity_map_${this.#id++}`; - const url = `url(#${id})`; + const url = this.#createUrl(id); this.#cache.set(map, url); this.#cache.set(key, url); @@ -389,7 +410,7 @@ class DOMFilterFactory extends BaseFilterFactory { filter ); - info.url = `url(#${id})`; + info.url = this.#createUrl(id); return info.url; } diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index df69d2255..01b3ee127 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -127,6 +127,7 @@ !issue7891_bc0.pdf !issue11242_reduced.pdf !issue16176.pdf +!issue16287.pdf !issue17064_readonly.pdf !issue11279.pdf !issue11362.pdf diff --git a/test/pdfs/issue16287.pdf b/test/pdfs/issue16287.pdf new file mode 100644 index 000000000..2a910231a Binary files /dev/null and b/test/pdfs/issue16287.pdf differ diff --git a/test/test_manifest.json b/test/test_manifest.json index 90ad056ec..f970556c0 100644 --- a/test/test_manifest.json +++ b/test/test_manifest.json @@ -5646,6 +5646,14 @@ "rounds": 1, "type": "eq" }, + { + "id": "issue16287", + "file": "pdfs/issue16287.pdf", + "md5": "cd3e0859140465ae8b8bde0c95cb4929", + "rounds": 1, + "type": "eq", + "about": "Please note that this file currently renders incorrectly." + }, { "id": "issue2006", "file": "pdfs/issue2006.pdf",