diff --git a/src/calibre/ebooks/oeb/transforms/rasterize.py b/src/calibre/ebooks/oeb/transforms/rasterize.py index d5eb7c5008..0b222deeca 100644 --- a/src/calibre/ebooks/oeb/transforms/rasterize.py +++ b/src/calibre/ebooks/oeb/transforms/rasterize.py @@ -8,9 +8,8 @@ __copyright__ = '2008, Marshall T. Vandegrift ' import os from urlparse import urldefrag -import base64 from lxml import etree -from PyQt4.QtCore import Qt +from PyQt4.QtCore import Qt, QUrl from PyQt4.QtCore import QByteArray from PyQt4.QtCore import QBuffer from PyQt4.QtCore import QIODevice @@ -18,11 +17,14 @@ from PyQt4.QtGui import QColor from PyQt4.QtGui import QImage from PyQt4.QtGui import QPainter from PyQt4.QtSvg import QSvgRenderer +from calibre.constants import iswindows from calibre.ebooks.oeb.base import XHTML, XLINK from calibre.ebooks.oeb.base import SVG_MIME, PNG_MIME from calibre.ebooks.oeb.base import xml2str, xpath from calibre.ebooks.oeb.base import urlnormalize from calibre.ebooks.oeb.stylizer import Stylizer +from calibre.ptempfile import PersistentTemporaryFile +from calibre.utils.imghdr import what IMAGE_TAGS = set([XHTML('img'), XHTML('object')]) KEEP_ATTRS = set(['class', 'style', 'width', 'height', 'align']) @@ -46,6 +48,7 @@ class SVGRasterizer(object): def __call__(self, oeb, context): oeb.logger.info('Rasterizing SVG images...') + self.temp_files = [] self.stylizer_cache = {} self.oeb = oeb self.opts = context @@ -54,6 +57,11 @@ class SVGRasterizer(object): self.dataize_manifest() self.rasterize_spine() self.rasterize_cover() + for pt in self.temp_files: + try: + os.remove(pt) + except: + pass def rasterize_svg(self, elem, width=0, height=0, format='PNG'): view_box = elem.get('viewBox', elem.get('viewbox', None)) @@ -112,9 +120,15 @@ class SVGRasterizer(object): if abshref not in hrefs: continue linkee = hrefs[abshref] - data = base64.encodestring(str(linkee)) - data = "data:%s;base64,%s" % (linkee.media_type, data) - elem.attrib[XLINK('href')] = data + data = str(linkee) + ext = what(None, data) or 'jpg' + with PersistentTemporaryFile(suffix='.'+ext) as pt: + pt.write(data) + self.temp_files.append(pt.name) + href = unicode(QUrl.fromLocalFile(pt.name).toString())[len('file://'):] + if iswindows: + href = href[1:] + elem.attrib[XLINK('href')] = href return svg def stylizer(self, item):