mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Conversion: Convert images encoded as data URIs in the input document into normal images, as some ebook reader software cannot handle data URIs. Fixes #1405803 [Can't see images in *.mobi in Kindle after convertation](https://bugs.launchpad.net/calibre/+bug/1405803)
This commit is contained in:
parent
b055c70cb5
commit
9bb34dffa3
@ -1067,6 +1067,8 @@ OptionRecommendation(name='search_replace',
|
|||||||
|
|
||||||
self.oeb.plumber_output_format = self.output_fmt or ''
|
self.oeb.plumber_output_format = self.output_fmt or ''
|
||||||
|
|
||||||
|
from calibre.ebooks.oeb.transforms.data_url import DataURL
|
||||||
|
DataURL()(self.oeb, self.opts)
|
||||||
from calibre.ebooks.oeb.transforms.guide import Clean
|
from calibre.ebooks.oeb.transforms.guide import Clean
|
||||||
Clean()(self.oeb, self.opts)
|
Clean()(self.oeb, self.opts)
|
||||||
pr(0.1)
|
pr(0.1)
|
||||||
|
50
src/calibre/ebooks/oeb/transforms/data_url.py
Normal file
50
src/calibre/ebooks/oeb/transforms/data_url.py
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
#!/usr/bin/env python
|
||||||
|
# vim:fileencoding=utf-8
|
||||||
|
from __future__ import (unicode_literals, division, absolute_import,
|
||||||
|
print_function)
|
||||||
|
|
||||||
|
__license__ = 'GPL v3'
|
||||||
|
__copyright__ = '2014, Kovid Goyal <kovid at kovidgoyal.net>'
|
||||||
|
|
||||||
|
import re
|
||||||
|
from calibre.ebooks.oeb.base import XPath, urlunquote
|
||||||
|
|
||||||
|
class DataURL(object):
|
||||||
|
|
||||||
|
def __call__(self, oeb, opts):
|
||||||
|
self.log = oeb.log
|
||||||
|
attr_path = XPath('//h:img[@src]')
|
||||||
|
for item in oeb.spine:
|
||||||
|
root = item.data
|
||||||
|
if not hasattr(root, 'xpath'):
|
||||||
|
continue
|
||||||
|
for img in attr_path(root):
|
||||||
|
raw = img.get('src')
|
||||||
|
if not raw.startswith('data:'):
|
||||||
|
continue
|
||||||
|
header, data = raw.partition(',')[0::2]
|
||||||
|
if not header.startswith('data:image/') or not data:
|
||||||
|
continue
|
||||||
|
if ';base64' in header:
|
||||||
|
data = re.sub(r'\s+', '', data)
|
||||||
|
from base64 import b64decode
|
||||||
|
try:
|
||||||
|
data = b64decode(data)
|
||||||
|
except Exception:
|
||||||
|
self.log.error('Found invalid base64 encoded data URI, ignoring it')
|
||||||
|
continue
|
||||||
|
else:
|
||||||
|
data = urlunquote(data)
|
||||||
|
from imghdr import what
|
||||||
|
fmt = what(None, data)
|
||||||
|
if not fmt:
|
||||||
|
self.log.warn('Image encoded as data URL has unknown format, ignoring')
|
||||||
|
continue
|
||||||
|
img.set('src', item.relhref(self.convert_image_data_uri(data, fmt, oeb)))
|
||||||
|
|
||||||
|
def convert_image_data_uri(self, data, fmt, oeb):
|
||||||
|
self.log('Found image encoded as data URI converting it to normal image')
|
||||||
|
from calibre import guess_type
|
||||||
|
item_id, item_href = oeb.manifest.generate('data-url-image', 'data-url-image.' + fmt)
|
||||||
|
oeb.manifest.add(item_id, item_href, guess_type(item_href)[0], data=data)
|
||||||
|
return item_href
|
Loading…
x
Reference in New Issue
Block a user