Как напечатать простую таблицу HTML с QWebView и QPrinter, не обрезая правую сторону?
Начиная с моего обновления с Qt 4.7.4 до Qt 4.8.7, я не могу напечатать простую таблицу HTML, не обрезая правую сторону. Вот мой код PySide, который показывает таблицу в QPrintPreviewDialog (проблема не связана с PySide или PyQt, и вы можете воспроизвести ее с помощью C++ и Qt):
app = QtGui.QApplication(sys.argv)
webView = QWebView()
webView.load(QtCore.QUrl('table.html'))
printer = QtGui.QPrinter()
printer.setPaperSize(QtGui.QPrinter.A4)
printPreview = QtGui.QPrintPreviewDialog(printer)
printPreview.paintRequested.connect(webView.print_)
#Avoid blank preview on startup
QtGui.QApplication.processEvents()
printPreview.show()
app.exec_()
А вот HTML-код моей простой таблицы:
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<style>
table {
width:100%;
border-collapse:collapse;
}
table, td, tr, th{
border:0.091em solid grey;
}
</style>
</head>
<body>
<table>
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>ENDENAME</th>
</tr>
<tr>
<td>Jill</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>ENDE</td>
</tr>
</table>
</body>
</html>
Как видите, правая сторона стола отсутствует.
С Qt 4.7.4 результат был верным, вот скриншот:
Я пытался исследовать проблему самостоятельно. И я обнаружил, что если соотношение между printer.pageRect(). Size(). Width() и webView.page(). MainFrame(). ContentsSize(). Width() меньше 0,5, происходит резка (при 96 DPI для принтера и экрана). Если значение DPI отличается, то вы должны преобразовать оба значения в дюймы для правильного отношения.
contentSize = webView.page().mainFrame().contentsSize().width()
pageSize = printer.pageRect().size().width()
pageWidthNorm = float(pageWidth)/float(printer.resolution())
contentWidthNorm = contentSize.width() / horizontalDpi
#Cutting off at 0.5
magicFactor = float(pageWidthNorm)/float(contentWidthNorm)
Однако я не могу решить эту проблему с этой информацией. Я попытался установить этот magicFactor как zoomFactor для QWebView, и он работает. Но результат очень уродливый и не тот, который я хочу.
Я надеюсь, что кто-то может мне помочь. Спасибо.
1 ответ
from PyQt4.QtWebKit import QWebView
def handlePrint(self):
dialog = QtGui.QPrintDialog()
if dialog.exec_() == QtGui.QDialog.Accepted:
self.handlePaintRequest(dialog.printer())
def handlePaintRequest(self, printer):
html = """
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8">
<style>
table {
width:100%;
border-collapse:collapse;
}
table, td, tr, th{
border:0.091em solid grey;
}
</style>
</head>
<body>
<table>
<tr>
<th>Firstname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>Lastname</th>
<th>ENDENAME</th>
</tr>
<tr>
<td>Jill</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>Smith</td>
<td>ENDE</td>
</tr>
</table>
</body>
</html>
"""
web_view = QWebView()
web_view.setHtml(html)
web_view.print_(printer)