diff --git a/modules/book/src/main/java/me/ag2s/epublib/domain/LazyResource.java b/modules/book/src/main/java/me/ag2s/epublib/domain/LazyResource.java index 3492007f4..6d5d897be 100644 --- a/modules/book/src/main/java/me/ag2s/epublib/domain/LazyResource.java +++ b/modules/book/src/main/java/me/ag2s/epublib/domain/LazyResource.java @@ -101,6 +101,13 @@ public class LazyResource extends Resource { throw new IOException( "Could not load the contents of resource: " + this.getHref()); } else { + /*掌上书苑有很多自制书OPF的nameSpace格式不标准,强制修复成正确的格式*/ + if (getHref().endsWith("opf")) { + String string = new String(readData) + .replace(" smlns=\"", " xmlns=\"") + .replace(" mlns=\"", " xmlns=\""); + readData = string.getBytes(); + } this.data = readData; } diff --git a/modules/book/src/main/java/me/ag2s/epublib/epub/PackageDocumentReader.java b/modules/book/src/main/java/me/ag2s/epublib/epub/PackageDocumentReader.java index db6f429ea..891dbad80 100644 --- a/modules/book/src/main/java/me/ag2s/epublib/epub/PackageDocumentReader.java +++ b/modules/book/src/main/java/me/ag2s/epublib/epub/PackageDocumentReader.java @@ -75,17 +75,28 @@ public class PackageDocumentReader extends PackageDocumentBase { /** * 修复一些非标准epub格式由于 opf 文件内容不全而读取不到图片的问题 * - * @return ,修复图片路径后的一个Element列表 + * @return 修复图片路径后的一个Element列表 * @author qianfanguojin */ private static ArrayList ensureImageInfo(Resources resources, - Element manifestElement) { + Element manifestElement, + Document packageDocument) { ArrayList fixedElements = new ArrayList<>(); - //加入当前所有的 item 标签 + HashSet originItemHrefSet = new HashSet<>(); + //加入当前所有的 item 标签 并将 href 保存到集合中 NodeList originItemElements = manifestElement .getElementsByTagNameNS(NAMESPACE_OPF, OPFTags.item); for (int i = 0; i < originItemElements.getLength(); i++) { - fixedElements.add((Element) originItemElements.item(i)); + Element itemElement = (Element) originItemElements.item(i); + fixedElements.add(itemElement); + String href = DOMUtil + .getAttribute(itemElement, NAMESPACE_OPF, OPFAttributes.href); + try { + href = URLDecoder.decode(href, Constants.CHARACTER_ENCODING); + } catch (UnsupportedEncodingException e) { + Log.e(TAG, e.getMessage()); + } + originItemHrefSet.add(href); } //如果有图片资源未定义在 originItemElements ,则加入该图片信息得到 fixedElements 中 @@ -93,36 +104,15 @@ public class PackageDocumentReader extends PackageDocumentBase { MediaType currentMediaType = resource.getMediaType(); if (currentMediaType == MediaTypes.JPG || currentMediaType == MediaTypes.PNG) { String imageHref = resource.getHref(); - //确保该图片信息 resource 在原 originItemElements 列表中没有出现过 - boolean flag = false; - int i; - for (i = 0; i < originItemElements.getLength(); i++) { - Element itemElement = (Element) originItemElements.item(i); - String href = DOMUtil - .getAttribute(itemElement, NAMESPACE_OPF, OPFAttributes.href); - try { - href = URLDecoder.decode(href, Constants.CHARACTER_ENCODING); - } catch (UnsupportedEncodingException e) { - Log.e(TAG, e.getMessage()); - } - if (href.equals(imageHref)) { - break; - } - } - if (i == originItemElements.getLength()) { - flag = true; - } - if (flag) { - //由于暂时无法实例化一个Element,则选择克隆一个已存在的节点来修改以达到新增 Element 的效果,作为临时解决方案 - Element tempElement = (Element) manifestElement.getElementsByTagNameNS(NAMESPACE_OPF, OPFTags.item).item(0).cloneNode(true); + //确保该图片信息 resource 在原 originItemHrefSet 集合中没有出现过 + if (!originItemHrefSet.contains(imageHref)) { + Element tempElement = packageDocument.createElement("item"); tempElement.setAttribute("id", imageHref.replace("/", "")); tempElement.setAttribute("href", imageHref); tempElement.setAttribute("media-type", currentMediaType.getName()); fixedElements.add(tempElement); } } - - } return fixedElements; } @@ -151,7 +141,7 @@ public class PackageDocumentReader extends PackageDocumentBase { "Package document does not contain element " + OPFTags.manifest); return result; } - List ensuredElements = ensureImageInfo(resources, manifestElement); + List ensuredElements = ensureImageInfo(resources, manifestElement, packageDocument); for (Element itemElement : ensuredElements) { // Element itemElement = ; String id = DOMUtil