mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
PDF Output: Resize large images so that they do not get off at the right edge of the page.
This commit is contained in:
parent
79bd4403d0
commit
25758c4348
Binary file not shown.
@ -7,8 +7,6 @@
|
||||
###
|
||||
|
||||
log = window.calibre_utils.log
|
||||
viewport_to_document = window.calibre_utils.viewport_to_document
|
||||
absleft = window.calibre_utils.absleft
|
||||
|
||||
class PagedDisplay
|
||||
# This class is a namespace to expose functions via the
|
||||
@ -126,7 +124,25 @@ class PagedDisplay
|
||||
return sm
|
||||
|
||||
fit_images: () ->
|
||||
null
|
||||
# Ensure no images are wider than the available width in a column. Note
|
||||
# that this method use getBoundingClientRect() which means it will
|
||||
# force a relayout if the render tree is dirty.
|
||||
images = []
|
||||
for img in document.getElementsByTagName('img')
|
||||
previously_limited = calibre_utils.retrieve(img, 'width-limited', false)
|
||||
br = img.getBoundingClientRect()
|
||||
left = calibre_utils.viewport_to_document(br.left, 0, doc=img.ownerDocument)[0]
|
||||
col = this.column_at(left) * this.page_width
|
||||
rleft = left - col - this.current_margin_side
|
||||
width = br.right - br.left
|
||||
rright = rleft + width
|
||||
col_width = this.page_width - 2*this.current_margin_side
|
||||
if previously_limited or rright > col_width
|
||||
images.push([img, col_width - rleft])
|
||||
|
||||
for [img, max_width] in images
|
||||
img.style.setProperty('max-width', max_width+'px')
|
||||
calibre_utils.store(img, 'width-limited', true)
|
||||
|
||||
scroll_to_pos: (frac) ->
|
||||
# Scroll to the position represented by frac (number between 0 and 1)
|
||||
@ -263,7 +279,7 @@ class PagedDisplay
|
||||
elem.scrollIntoView()
|
||||
if this.in_paged_mode
|
||||
# Ensure we are scrolled to the column containing elem
|
||||
this.scroll_to_xpos(absleft(elem) + 5)
|
||||
this.scroll_to_xpos(calibre_utils.absleft(elem) + 5)
|
||||
|
||||
snap_to_selection: () ->
|
||||
# Ensure that the viewport is positioned at the start of the column
|
||||
@ -272,7 +288,7 @@ class PagedDisplay
|
||||
sel = window.getSelection()
|
||||
r = sel.getRangeAt(0).getBoundingClientRect()
|
||||
node = sel.anchorNode
|
||||
left = viewport_to_document(r.left, r.top, doc=node.ownerDocument)[0]
|
||||
left = calibre_utils.viewport_to_document(r.left, r.top, doc=node.ownerDocument)[0]
|
||||
|
||||
# Ensure we are scrolled to the column containing the start of the
|
||||
# selection
|
||||
@ -331,5 +347,5 @@ if window?
|
||||
window.paged_display = new PagedDisplay()
|
||||
|
||||
# TODO:
|
||||
# Resizing of images
|
||||
# Highlight on jump_to_anchor
|
||||
# Handle document specified margins and allow them to be overridden
|
||||
|
@ -117,7 +117,6 @@ class PDFMetadata(object):
|
||||
if len(oeb_metadata.creator) >= 1:
|
||||
self.author = authors_to_string([x.value for x in oeb_metadata.creator])
|
||||
|
||||
|
||||
class PDFWriter(QObject): # {{{
|
||||
|
||||
def __init__(self, opts, log, cover_data=None):
|
||||
@ -185,8 +184,8 @@ class PDFWriter(QObject): # {{{
|
||||
from PyQt4.Qt import QSize, QPainter
|
||||
if self.paged_js is None:
|
||||
from calibre.utils.resources import compiled_coffeescript
|
||||
self.paged_js = compiled_coffeescript('ebooks.oeb.display.paged',
|
||||
dynamic=False)
|
||||
self.paged_js = compiled_coffeescript('ebooks.oeb.display.utils')
|
||||
self.paged_js += compiled_coffeescript('ebooks.oeb.display.paged')
|
||||
printer = get_pdf_printer(self.opts, output_file_name=outpath)
|
||||
painter = QPainter(printer)
|
||||
zoomx = printer.logicalDpiX()/self.view.logicalDpiX()
|
||||
@ -202,6 +201,7 @@ class PDFWriter(QObject): # {{{
|
||||
document.body.style.backgroundColor = "white";
|
||||
paged_display.set_geometry(1, 0, 0, 0);
|
||||
paged_display.layout();
|
||||
paged_display.fit_images();
|
||||
''')
|
||||
mf = self.view.page().mainFrame()
|
||||
while True:
|
||||
|
@ -26,8 +26,8 @@ class Printing(QObject):
|
||||
for x in (Qt.Horizontal, Qt.Vertical):
|
||||
mf.setScrollBarPolicy(x, Qt.ScrollBarAlwaysOff)
|
||||
self.view.loadFinished.connect(self.load_finished)
|
||||
self.paged_js = compiled_coffeescript('ebooks.oeb.display.paged',
|
||||
dynamic=False)
|
||||
self.paged_js = compiled_coffeescript('ebooks.oeb.display.utils')
|
||||
self.paged_js += compiled_coffeescript('ebooks.oeb.display.paged')
|
||||
|
||||
def load_finished(self, ok):
|
||||
self.loaded_ok = ok
|
||||
@ -70,6 +70,7 @@ class Printing(QObject):
|
||||
document.body.style.backgroundColor = "white";
|
||||
paged_display.set_geometry(1, 0, 0, 0);
|
||||
paged_display.layout();
|
||||
paged_display.fit_images();
|
||||
''')
|
||||
|
||||
while True:
|
||||
|
Loading…
x
Reference in New Issue
Block a user