mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-06-23 15:30:45 -04:00
LRF output:Fix rendering of tables as images
This commit is contained in:
parent
f0df2ade62
commit
b1594e46c9
@ -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,41 +265,37 @@ 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:
|
continue
|
||||||
continue
|
try:
|
||||||
try:
|
self.add_file(path)
|
||||||
self.add_file(path)
|
except KeyboardInterrupt:
|
||||||
except KeyboardInterrupt:
|
raise
|
||||||
|
except:
|
||||||
|
if self.link_level == 0: # Die on errors in the first level
|
||||||
raise
|
raise
|
||||||
except:
|
for link in self.links:
|
||||||
if self.link_level == 0: # Die on errors in the first level
|
if link['path'] == path:
|
||||||
raise
|
self.links.remove(link)
|
||||||
for link in self.links:
|
break
|
||||||
if link['path'] == path:
|
self.log_warn('Could not process '+path)
|
||||||
self.links.remove(link)
|
if self.verbose:
|
||||||
break
|
self.log_exception(' ')
|
||||||
self.log_warn('Could not process '+path)
|
self.links = self.process_links()
|
||||||
if self.verbose:
|
self.link_level += 1
|
||||||
self.log_exception(' ')
|
paths = [link['path'] for link in self.links]
|
||||||
self.links = self.process_links()
|
|
||||||
self.link_level += 1
|
if self.current_page is not None and self.current_page.has_text():
|
||||||
paths = [link['path'] for link in self.links]
|
self.book.append(self.current_page)
|
||||||
|
|
||||||
if self.current_page is not None and self.current_page.has_text():
|
for text, tb in self.extra_toc_entries:
|
||||||
self.book.append(self.current_page)
|
self.book.addTocEntry(text, tb)
|
||||||
|
|
||||||
for text, tb in self.extra_toc_entries:
|
if self.base_font_size > 0:
|
||||||
self.book.addTocEntry(text, tb)
|
self.log_info('\tRationalizing font sizes...')
|
||||||
|
self.book.rationalize_font_sizes(self.base_font_size)
|
||||||
if self.base_font_size > 0:
|
|
||||||
self.log_info('\tRationalizing font sizes...')
|
|
||||||
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)
|
||||||
|
@ -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
|
@ -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!
|
|
||||||
|
@ -44,4 +44,3 @@ class cdnet(BasicNewsRecipe):
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
!DSPAM:3,496093f075721028352036!
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user