From dca5551f225f90fef6815c71a736d9352bc66806 Mon Sep 17 00:00:00 2001 From: AJ Banck Date: Sat, 17 Jan 2026 12:36:49 +0100 Subject: [PATCH] Decode cover related hrefs for findCoverHrefs --- .../epub4j/epub/PackageDocumentReader.java | 10 ++++++ .../epub/PackageDocumentReaderTest.java | 14 +++++++- .../resources/opf/test_urlencoded_href.opf | 32 +++++++++++++++++++ 3 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 epub4j-core/src/test/resources/opf/test_urlencoded_href.opf diff --git a/epub4j-core/src/main/java/io/documentnode/epub4j/epub/PackageDocumentReader.java b/epub4j-core/src/main/java/io/documentnode/epub4j/epub/PackageDocumentReader.java index 31a251f..304a9a0 100644 --- a/epub4j-core/src/main/java/io/documentnode/epub4j/epub/PackageDocumentReader.java +++ b/epub4j-core/src/main/java/io/documentnode/epub4j/epub/PackageDocumentReader.java @@ -369,6 +369,11 @@ static Set findCoverHrefs(Document packageDocument) { OPFTags.item, OPFAttributes.id, coverResourceId, OPFAttributes.href); if (StringUtil.isNotBlank(coverHref)) { + try { + coverHref = URLDecoder.decode(coverHref, Constants.CHARACTER_ENCODING); + } catch (UnsupportedEncodingException e) { + log.error(e.getMessage()); + } result.add(coverHref); } else { result.add( @@ -381,6 +386,11 @@ static Set findCoverHrefs(Document packageDocument) { OPFTags.reference, OPFAttributes.type, OPFValues.reference_cover, OPFAttributes.href); if (StringUtil.isNotBlank(coverHref)) { + try { + coverHref = URLDecoder.decode(coverHref, Constants.CHARACTER_ENCODING); + } catch (UnsupportedEncodingException e) { + log.error(e.getMessage()); + } result.add(coverHref); } return result; diff --git a/epub4j-core/src/test/java/io/documentnode/epub4j/epub/PackageDocumentReaderTest.java b/epub4j-core/src/test/java/io/documentnode/epub4j/epub/PackageDocumentReaderTest.java index 105af12..851aed5 100644 --- a/epub4j-core/src/test/java/io/documentnode/epub4j/epub/PackageDocumentReaderTest.java +++ b/epub4j-core/src/test/java/io/documentnode/epub4j/epub/PackageDocumentReaderTest.java @@ -8,6 +8,8 @@ import java.io.IOException; import java.util.Arrays; import java.util.Collection; +import java.util.HashSet; +import java.util.Set; import org.junit.Assert; import org.junit.Test; @@ -28,7 +30,17 @@ public void testFindCoverHref_content1() throws SAXException, IOException { assertEquals(1, coverHrefs.size()); assertEquals("cover.html", coverHrefs.iterator().next()); } - + + @Test + public void testFindCoverHref_URLEncoded() throws SAXException, IOException { + Set expected = new HashSet<>(Arrays.asList("cover+.png", "cover+.html")); + Document packageDocument; + packageDocument = EpubProcessorSupport.createDocumentBuilder().parse(PackageDocumentReaderTest.class.getResourceAsStream("/opf/test_urlencoded_href.opf")); + Collection coverHrefs = PackageDocumentReader.findCoverHrefs(packageDocument); + assertEquals(2, coverHrefs.size()); + assertEquals(expected, coverHrefs); + } + @Test public void testFindTableOfContentsResource_simple_correct_toc_id() { // given diff --git a/epub4j-core/src/test/resources/opf/test_urlencoded_href.opf b/epub4j-core/src/test/resources/opf/test_urlencoded_href.opf new file mode 100644 index 0000000..8101d2d --- /dev/null +++ b/epub4j-core/src/test/resources/opf/test_urlencoded_href.opf @@ -0,0 +1,32 @@ + + + + EPUB4J test book 1 + Joe Tester + 2010-05-27 + en + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file