This commit is contained in:
Horis 2023-12-08 16:48:28 +08:00
parent 25aec01b1a
commit 900bc3876c
2 changed files with 26 additions and 29 deletions

View File

@ -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;
}

View File

@ -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