diff --git a/src/calibre/ebooks/conversion/plugins/lrf_output.py b/src/calibre/ebooks/conversion/plugins/lrf_output.py index 88b6a6885d..947d30cdc6 100644 --- a/src/calibre/ebooks/conversion/plugins/lrf_output.py +++ b/src/calibre/ebooks/conversion/plugins/lrf_output.py @@ -117,8 +117,7 @@ class LRFOutput(OutputFormatPlugin): ), OptionRecommendation(name='render_tables_as_images', recommended_value=False, - help=_('Render tables in the HTML as images (useful if the ' - 'document has large or complex tables)') + help=_('This option has no effect') ), OptionRecommendation(name='text_size_multiplier_for_rendered_tables', recommended_value=1.0, diff --git a/src/calibre/ebooks/lrf/html/convert_from.py b/src/calibre/ebooks/lrf/html/convert_from.py index 781d205e05..d21f920d78 100644 --- a/src/calibre/ebooks/lrf/html/convert_from.py +++ b/src/calibre/ebooks/lrf/html/convert_from.py @@ -1727,44 +1727,18 @@ class HTMLConverter(object): self.previous_text = ' ' self.process_children(tag, tag_css, tag_pseudo_css) elif tagname == 'table' and not self.ignore_tables and not self.in_table: - if self.render_tables_as_images: - print('Rendering table...') - from calibre.ebooks.lrf.html.table_as_image import render_table - pheight = int(self.current_page.pageStyle.attrs['textheight']) - pwidth = int(self.current_page.pageStyle.attrs['textwidth']) - images = render_table(self.soup, tag, tag_css, - os.path.dirname(self.target_prefix), - pwidth, pheight, self.profile.dpi, - self.text_size_multiplier_for_rendered_tables) - for path, width, height in images: - stream = ImageStream(path, encoding='PNG') - im = Image(stream, x0=0, y0=0, x1=width, y1=height, - xsize=width, ysize=height) - pb = self.current_block - self.end_current_para() - self.process_alignment(tag_css) - self.current_para.append(Plot(im, xsize=width*720./self.profile.dpi, - ysize=height*720./self.profile.dpi)) - self.current_block.append(self.current_para) - self.current_page.append(self.current_block) - self.current_block = self.book.create_text_block( - textStyle=pb.textStyle, - blockStyle=pb.blockStyle) - self.current_para = Paragraph() - - else: - tag_css = self.tag_css(tag)[0] # Table should not inherit CSS - try: - self.process_table(tag, tag_css) - except Exception as err: - self.log.warning(_('An error occurred while processing a table: %s. Ignoring table markup.')%repr(err)) - self.log.exception('') - self.log.debug(_('Bad table:\n%s')%unicode_type(tag)[:300]) - self.in_table = False - self.process_children(tag, tag_css, tag_pseudo_css) - finally: - if self.minimize_memory_usage: - tag.extract() + tag_css = self.tag_css(tag)[0] # Table should not inherit CSS + try: + self.process_table(tag, tag_css) + except Exception as err: + self.log.warning(_('An error occurred while processing a table: %s. Ignoring table markup.')%repr(err)) + self.log.exception('') + self.log.debug(_('Bad table:\n%s')%unicode_type(tag)[:300]) + self.in_table = False + self.process_children(tag, tag_css, tag_pseudo_css) + finally: + if self.minimize_memory_usage: + tag.extract() else: self.process_children(tag, tag_css, tag_pseudo_css) finally: diff --git a/src/calibre/ebooks/lrf/html/table_as_image.py b/src/calibre/ebooks/lrf/html/table_as_image.py deleted file mode 100644 index 9606e49476..0000000000 --- a/src/calibre/ebooks/lrf/html/table_as_image.py +++ /dev/null @@ -1,102 +0,0 @@ -#!/usr/bin/env python2 -from __future__ import absolute_import, division, print_function, unicode_literals - -__license__ = 'GPL v3' -__copyright__ = '2008, Kovid Goyal kovid@kovidgoyal.net' -__docformat__ = 'restructuredtext en' - -''' -Render HTML tables as images. -''' -import os, tempfile, atexit, shutil -from PyQt5.Qt import QUrl, QApplication, QSize, QEventLoop, \ - QPainter, QImage, QObject, Qt -from PyQt5.QtWebKitWidgets import QWebPage - -from polyglot.builtins import unicode_type - - -class HTMLTableRenderer(QObject): - - def __init__(self, html, base_dir, width, height, dpi, factor): - ''' - `width, height`: page width and height in pixels - `base_dir`: The directory in which the HTML file that contains the table resides - ''' - from calibre.gui2 import secure_web_page - QObject.__init__(self) - - self.app = None - self.width, self.height, self.dpi = width, height, dpi - self.base_dir = base_dir - self.images = [] - self.tdir = tempfile.mkdtemp(prefix='calibre_render_table') - self.loop = QEventLoop() - self.page = QWebPage() - secure_web_page(self.page.settings()) - self.page.loadFinished.connect(self.render_html) - self.page.mainFrame().setTextSizeMultiplier(factor) - self.page.mainFrame().setHtml(html, - QUrl('file:'+os.path.abspath(self.base_dir))) - - def render_html(self, ok): - try: - if not ok: - return - cwidth, cheight = self.page.mainFrame().contentsSize().width(), self.page.mainFrame().contentsSize().height() - self.page.setViewportSize(QSize(cwidth, cheight)) - factor = float(self.width)/cwidth if cwidth > self.width else 1 - cutoff_height = int(self.height/factor)-3 - image = QImage(self.page.viewportSize(), QImage.Format_ARGB32) - image.setDotsPerMeterX(self.dpi*(100/2.54)) - image.setDotsPerMeterY(self.dpi*(100/2.54)) - painter = QPainter(image) - self.page.mainFrame().render(painter) - painter.end() - cheight = image.height() - cwidth = image.width() - pos = 0 - while pos < cheight: - img = image.copy(0, pos, cwidth, min(cheight-pos, cutoff_height)) - pos += cutoff_height-20 - if cwidth > self.width: - img = img.scaledToWidth(self.width, Qt.SmoothTransform) - f = os.path.join(self.tdir, '%d.png'%pos) - img.save(f) - self.images.append((f, img.width(), img.height())) - finally: - QApplication.quit() - - -def render_table(soup, table, css, base_dir, width, height, dpi, factor=1.0): - head = '' - for e in soup.findAll(['link', 'style']): - head += unicode_type(e)+'\n\n' - style = '' - for key, val in css.items(): - style += key + ':%s;'%val - html = '''\ - - - %s - - - - %s - - - '''%(head, width-10, style, unicode_type(table)) - images, tdir = do_render(html, base_dir, width, height, dpi, factor) - atexit.register(shutil.rmtree, tdir) - return images - - -def do_render(html, base_dir, width, height, dpi, factor): - from calibre.gui2 import is_ok_to_use_qt - if not is_ok_to_use_qt(): - raise Exception('Not OK to use Qt') - tr = HTMLTableRenderer(html, base_dir, width, height, dpi, factor) - tr.loop.exec_() - return tr.images, tr.tdir