LRF output:Fix rendering of tables as images

This commit is contained in:
Kovid Goyal 2009-01-04 10:12:00 -08:00
parent f0df2ade62
commit b1594e46c9
4 changed files with 42 additions and 65 deletions

View File

@ -245,7 +245,6 @@ class HTMLConverter(object, LoggingInterface):
self.override_css = {} self.override_css = {}
self.override_pcss = {} self.override_pcss = {}
self.table_render_job_server = None
if self._override_css is not None: if self._override_css is not None:
if os.access(self._override_css, os.R_OK): if os.access(self._override_css, os.R_OK):
@ -266,7 +265,6 @@ class HTMLConverter(object, LoggingInterface):
paths = [os.path.abspath(path) for path in paths] paths = [os.path.abspath(path) for path in paths]
paths = [path.decode(sys.getfilesystemencoding()) if not isinstance(path, unicode) else path for path in paths] paths = [path.decode(sys.getfilesystemencoding()) if not isinstance(path, unicode) else path for path in paths]
try:
while len(paths) > 0 and self.link_level <= self.link_levels: while len(paths) > 0 and self.link_level <= self.link_levels:
for path in paths: for path in paths:
if path in self.processed_files: if path in self.processed_files:
@ -298,9 +296,6 @@ class HTMLConverter(object, LoggingInterface):
if self.base_font_size > 0: if self.base_font_size > 0:
self.log_info('\tRationalizing font sizes...') self.log_info('\tRationalizing font sizes...')
self.book.rationalize_font_sizes(self.base_font_size) self.book.rationalize_font_sizes(self.base_font_size)
finally:
if self.table_render_job_server is not None:
self.table_render_job_server.killall()
def is_baen(self, soup): def is_baen(self, soup):
return bool(soup.find('meta', attrs={'name':'Publisher', return bool(soup.find('meta', attrs={'name':'Publisher',
@ -1732,15 +1727,11 @@ class HTMLConverter(object, LoggingInterface):
self.process_children(tag, tag_css, tag_pseudo_css) self.process_children(tag, tag_css, tag_pseudo_css)
elif tagname == 'table' and not self.ignore_tables and not self.in_table: elif tagname == 'table' and not self.ignore_tables and not self.in_table:
if self.render_tables_as_images: if self.render_tables_as_images:
if self.table_render_job_server is None:
from calibre.parallel import Server
self.table_render_job_server = Server(number_of_workers=1)
print 'Rendering table...' print 'Rendering table...'
from calibre.ebooks.lrf.html.table_as_image import render_table from calibre.ebooks.lrf.html.table_as_image import render_table
pheight = int(self.current_page.pageStyle.attrs['textheight']) pheight = int(self.current_page.pageStyle.attrs['textheight'])
pwidth = int(self.current_page.pageStyle.attrs['textwidth']) pwidth = int(self.current_page.pageStyle.attrs['textwidth'])
images = render_table(self.table_render_job_server, images = render_table(self.soup, tag, tag_css,
self.soup, tag, tag_css,
os.path.dirname(self.target_prefix), os.path.dirname(self.target_prefix),
pwidth, pheight, self.profile.dpi, pwidth, pheight, self.profile.dpi,
self.text_size_multiplier_for_rendered_tables) self.text_size_multiplier_for_rendered_tables)

View File

@ -6,14 +6,11 @@ __docformat__ = 'restructuredtext en'
''' '''
Render HTML tables as images. Render HTML tables as images.
''' '''
import os, tempfile, atexit, shutil, time import os, tempfile, atexit, shutil
from PyQt4.Qt import QUrl, QApplication, QSize, \ from PyQt4.Qt import QUrl, QApplication, QSize, QEventLoop, \
SIGNAL, QPainter, QImage, QObject, Qt SIGNAL, QPainter, QImage, QObject, Qt
from PyQt4.QtWebKit import QWebPage from PyQt4.QtWebKit import QWebPage
from calibre.parallel import ParallelJob
__app = None
class HTMLTableRenderer(QObject): class HTMLTableRenderer(QObject):
@ -27,13 +24,15 @@ class HTMLTableRenderer(QObject):
self.app = None self.app = None
self.width, self.height, self.dpi = width, height, dpi self.width, self.height, self.dpi = width, height, dpi
self.base_dir = base_dir self.base_dir = base_dir
self.images = []
self.tdir = tempfile.mkdtemp(prefix='calibre_render_table')
self.loop = QEventLoop()
self.page = QWebPage() self.page = QWebPage()
self.connect(self.page, SIGNAL('loadFinished(bool)'), self.render_html) self.connect(self.page, SIGNAL('loadFinished(bool)'), self.render_html)
self.page.mainFrame().setTextSizeMultiplier(factor) self.page.mainFrame().setTextSizeMultiplier(factor)
self.page.mainFrame().setHtml(html, self.page.mainFrame().setHtml(html,
QUrl('file:'+os.path.abspath(self.base_dir))) QUrl('file:'+os.path.abspath(self.base_dir)))
self.images = []
self.tdir = tempfile.mkdtemp(prefix='calibre_render_table')
def render_html(self, ok): def render_html(self, ok):
try: try:
@ -63,7 +62,7 @@ class HTMLTableRenderer(QObject):
finally: finally:
QApplication.quit() QApplication.quit()
def render_table(server, soup, table, css, base_dir, width, height, dpi, factor=1.0): def render_table(soup, table, css, base_dir, width, height, dpi, factor=1.0):
head = '' head = ''
for e in soup.findAll(['link', 'style']): for e in soup.findAll(['link', 'style']):
head += unicode(e)+'\n\n' head += unicode(e)+'\n\n'
@ -83,24 +82,13 @@ def render_table(server, soup, table, css, base_dir, width, height, dpi, factor=
</body> </body>
</html> </html>
'''%(head, width-10, style, unicode(table)) '''%(head, width-10, style, unicode(table))
job = ParallelJob('render_table', lambda j : j, None, images, tdir = do_render(html, base_dir, width, height, dpi, factor)
args=[html, base_dir, width, height, dpi, factor])
server.add_job(job)
while not job.has_run:
time.sleep(2)
if job.exception is not None:
print 'Failed to render table'
print job.exception
print job.traceback
images, tdir = job.result
atexit.register(shutil.rmtree, tdir) atexit.register(shutil.rmtree, tdir)
return images return images
def do_render(html, base_dir, width, height, dpi, factor): def do_render(html, base_dir, width, height, dpi, factor):
app = QApplication.instance() if QApplication.instance() is None:
if app is None: QApplication([])
app = QApplication([])
tr = HTMLTableRenderer(html, base_dir, width, height, dpi, factor) tr = HTMLTableRenderer(html, base_dir, width, height, dpi, factor)
app.exec_() tr.loop.exec_()
return tr.images, tr.tdir return tr.images, tr.tdir

View File

@ -47,4 +47,3 @@ class FTheiseDe(BasicNewsRecipe):
feeds = [ ('FTD', 'http://www.ftd.de/static/ticker/ftd-topnews.rdf') ] feeds = [ ('FTD', 'http://www.ftd.de/static/ticker/ftd-topnews.rdf') ]
!DSPAM:3,496093f075721028352036!

View File

@ -44,4 +44,3 @@ class cdnet(BasicNewsRecipe):
!DSPAM:3,496093f075721028352036!