Horis 2 лет назад
Родитель
Сommit
1590aef627

+ 7 - 0
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;
             }
 

+ 19 - 29
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<Element> ensureImageInfo(Resources resources,
-                                                      Element manifestElement) {
+                                                      Element manifestElement,
+                                                      Document packageDocument) {
         ArrayList<Element> fixedElements = new ArrayList<>();
-        //加入当前所有的 item 标签
+        HashSet<String> 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<Element> ensuredElements = ensureImageInfo(resources, manifestElement);
+        List<Element> ensuredElements = ensureImageInfo(resources, manifestElement, packageDocument);
         for (Element itemElement : ensuredElements) {
 //            Element itemElement = ;
             String id = DOMUtil