PDF Output: Improve handling of images that do not fit on a page. Fixes #1852205 [Calibre Vers. 4, new Viewer print feature.](https://bugs.launchpad.net/calibre/+bug/1852205)

This commit is contained in:
Kovid Goyal 2019-11-15 10:45:03 +05:30
parent 9e8585faf1
commit f825c7c4d6
No known key found for this signature in database
GPG Key ID: 06BC317B515ACE7C
2 changed files with 41 additions and 0 deletions

31
resources/pdf-preprint.js Normal file
View File

@ -0,0 +1,31 @@
/* vim:fileencoding=utf-8
*
* Copyright (C) 2019 Kovid Goyal <kovid at kovidgoyal.net>
*
* Distributed under terms of the GPLv3 license
*/
/*jshint esversion: 6 */
(function() {
"use strict";
// wrap up long words that dont fit in the page
document.body.style.overflowWrap = 'break-word';
var block_styles = {
"run-in":1, "block":1, "table-row-group":1, "table-column":1, "table-column-group":1,
"table-header-group":1, "table-footer-group":1, "table-row":1, "table-cell":1,
"table-caption":1, "inline-block:":1
};
for (const img of document.images) {
var style = window.getComputedStyle(img);
if (style.maxHeight === 'none') img.style.maxHeight = '100vh';
if (style.maxWidth === 'none') img.style.maxWidth = '100vw';
if (block_styles[style.display]) {
img.style.pageBreakInside = 'avoid';
img.style.breakInside = 'avoid';
}
}
})();

View File

@ -60,6 +60,13 @@ def data_as_pdf_doc(data):
return ans
def preprint_js():
ans = getattr(preprint_js, 'ans', None)
if ans is None:
ans = preprint_js.ans = P('pdf-preprint.js', data=True).decode('utf-8')
return ans
def last_tag(root):
return tuple(root.iterchildren('*'))[-1]
@ -196,6 +203,9 @@ class Renderer(QWebEnginePage):
pass
def print_to_pdf(self):
self.runJavaScript(preprint_js(), self.start_print)
def start_print(self, *a):
self.printToPdf(self.printing_done, self.page_layout)
def printing_done(self, pdf_data):