我正在寻找使用Python将网页打印成本地文件PDF的解决方案.一个很好的解决方案是使用Qt,在这里找到,https://bharatikunal.wordpress.com/2010/01/.
它在开始时没有用,因为我遇到了安装PyQt4的问题,因为它给出了错误消息,例如'ImportError:没有名为PyQt4.QtCore的模块'和'ImportError:没有名为PyQt4.QtCore的模块'.
这是因为PyQt4安装不正确.我曾经把库放在C:\ Python27\Lib但是它不适用于PyQt4.
实际上,它只需要从http://www.riverbankcomputing.com/software/pyqt/download下载(请注意您正在使用的正确的Python版本),并将其安装到C:\ Python27(我的情况).而已.
现在脚本运行正常,所以我想分享它.有关使用Qprinter的更多选项,请参阅http://qt-project.org/doc/qt-4.8/qprinter.html#Orientation-enum.
在我的Qt应用程序中,我正在进行一些网络测试.我必须根据测试输出创建一个报告.所以我需要以pdf格式创建报告.
有人可以告诉我如何将我的测试结果放在pdf文件中吗?我的结果包含使用Qwt库的图表.
唯一的问题是纠正,QPrintPreviewDialog
但当打印在纸上打印时,故障仍然存在.
随着QPrintPreviewDialog
网页的工作完美,但"纸"(纸打印)从第二页"文本"和"图像"(无背景)消失(显然是错误只发生(即除第一个出现的BUG所有页面)内联元素).
请参阅:https: //bugreports.qt.io/browse/QTBUG-37240(请参阅测试用例的附件)
打印带有小字体和图像的QWebView的第一页.
显然,只有内联元素(文本和图像)才会出现问题.
注意:该错误发生在Windows XP,Windows 7,Window 7 x64,Mac OS X 10.8.3中
[编辑]
Source-html:http://jsfiddle.net/bdm6Y/2/
框架内容:http://jsfiddle.net/bdm6Y/2/show/
资源:
QPrinter p;
p.setPaperSize(QPrinter::A4);
p.setFullPage(true);
p.setResolution(300);
p.setOrientation(QPrinter::Portrait);
QPrintPreviewDialog preview(&p);
preview.setWindowTitle(ui->myWebView->page()->mainFrame()->title());
connect(&preview, SIGNAL(paintRequested(QPrinter*)), this, SLOT(printPreview(QPrinter*)));
preview.exec();
...
void printPreview(QPrinter *printer) {
ui->myWebView->print(printer);
}
Run Code Online (Sandbox Code Playgroud)
我不知道这是一个错误还是我做错了什么,它会是什么?
谢谢!
[编辑]
QT错误报告:
我想创建一个具有正确样式HTML的PDF文档.这就是我想要的:
QTextDocument *doc = new QTextDocument();
const char* s1 = "<html><head><style>body { font-family: sans-serif;}.note-atomic { background: rgb(242,242,242); width: 1000px; margin: 5px auto; border: 1px solid grey; border-radius: 8px;padding: 5px;}</style></head><body><div class = 'note-atomic'>Hi</div><img src = '/Users/attitude/Desktop/RnSghvV.png' width='400' height='300' /></body></html>";
doc->setHtml(QString::fromStdString(s1));
QPrinter *printer = new QPrinter();
printer->setOutputFileName("/Users/attitude/Desktop/fool.pdf");
printer->setOutputFormat(QPrinter::PdfFormat);
QPainter *painter = new QPainter();
painter->begin( printer );
doc->drawContents(painter, printer->pageRect().translated( -printer->pageRect().x(), - printer->pageRect().y() ));
doc->print(printer);
const char* s2 = "<html><body><div>Bye</div></body></html>";
doc->setHtml(QString::fromStdString(s2));
printer->newPage();
doc->drawContents(painter, printer->pageRect().translated( -printer->pageRect().x(), - printer->pageRect().y() ));
doc->print(printer);
painter->end();
Run Code Online (Sandbox Code Playgroud)
我希望PDF有两页 - 第一页有文字Hi …
我尝试按照文档打印 QWidet,但收到错误。当我运行以下代码时,我得到了QPaintDevice: Cannot destroy paint device that is being painted
.
import sys
from PyQt4 import QtGui, QtCore
class SampleApp(QtGui.QDialog):
def __init__(self):
super().__init__()
layout = QtGui.QVBoxLayout()
self.setLayout(layout)
text_editor = QtGui.QTextEdit()
layout.addWidget(text_editor)
button = QtGui.QPushButton("Print")
layout.addWidget(button)
button.clicked.connect(self.print_me)
def print_me(self):
printer = QtGui.QPrinter()
printer.setOutputFormat(QtGui.QPrinter.PdfFormat)
printer.setOutputFileName("Test.pdf")
self.painter = QtGui.QPainter(printer)
margins = printer.getPageMargins(QtGui.QPrinter.DevicePixel)
xscale = (printer.pageRect().width() - margins[0]) / self.width()
yscale = (printer.pageRect().height() - margins[1]) / self.height()
scale = min(xscale, yscale)
self.painter.scale(scale, scale)
self.render(self.painter)
app = QtGui.QApplication(sys.argv)
ex = SampleApp()
ex.show() …
Run Code Online (Sandbox Code Playgroud) 我正在尝试打印 .a 的内容QGraphicsScene
。目标打印机可以是任何打印机 - 从普通打印机到自定义尺寸的特殊打印机。它必须以实际尺寸(英寸、毫米……)打印内容。
在QGraphicsScene
我使用的假设是 72 ppi。
我假设:
1)将场景渲染到打印机将根据打印机分辨率来完成,这样我就可以获得与屏幕上显示的类似的实际尺寸(英寸/毫米)的项目。
2)我可以将打印机的纸张尺寸设置为所需的画布尺寸(这是一个非常大的场景上的矩形),超出它的范围就不会打印
3)我可以设置边距,“实际画布”之外的内容将不得打印,包括页边空白处的内容。
到目前为止我的所有假设都是错误的:
1)对于不同的打印机,如果我建议接近其默认纸张尺寸的自定义尺寸(或者如果我没有设置纸张),则渲染似乎是最大适合(使用纵横比)尺寸);
如果我设置的纸张尺寸不接近(例如默认“LETTER”尺寸的打印机上的 4x4 英寸),它只会打印一张空白页。
2-3) 在有打印的情况下,打印机只是将画布拉伸至整页,绘图区域之外的所有项目仍会打印。
我尝试在画家上或通过在渲染时设置目标矩形来进行剪辑,结果是对场景的一小部分进行了非常奇怪的剪辑。
我尝试过 HP LaserJet、Adobe PDF 和一些特定尺寸(如 4x6 英寸)的自定义打印机。他们都根据我是否指定纵向或横向将场景缩放到最大尺寸,并完全忽略我的纸张尺寸要求或实际尺寸。
这是一个小示例程序,用于重现我正在尝试做的事情。
代码中的注释显示了我尝试过的一些选项。
#include <QApplication>
#include <QGraphicsView>
#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QGraphicsEllipseItem>
#include <QPrinter>
#include <QPrintDialog>
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QGraphicsScene* s = new QGraphicsScene();
s->setSceneRect(-500, -500, 1500, 1500);
QGraphicsView* view = new QGraphicsView();
view->setScene(s);
view->show();
int canvasSize = 288; // 4 in
QRectF …
Run Code Online (Sandbox Code Playgroud) 在我的小应用程序中,我想在每个页面中预览一些HTML内容,因此我使用了以下代码
/*
* Handle events when clicking button to preview content
*/
void MainWindow::on_pushButton_clicked()
{
QPrinter printer;
printer.setPaperSize(QPrinter::A4);
printer.setOrientation(QPrinter::Portrait);
printer.setFullPage(true);
QPrintPreviewDialog *printPreview = new QPrintPreviewDialog(&printer);
connect(printPreview, SIGNAL(paintRequested(QPrinter*)), this, SLOT(printAllTitle(QPrinter*)));
printPreview->setWindowTitle("Demo");
Qt::WindowFlags flags(Qt::WindowTitleHint);
printPreview->setWindowFlags(flags);
printPreview->showMaximized();
printPreview->exec();
}
/*
* Show preview content
*/
void MainWindow::printAllTitle(QPrinter *printer)
{
QVector<QString> titles;
titles.push_back("Title 1");
titles.push_back("Title 2");
QString strStream;
QTextStream out(&strStream);
for (int i = 0; i < titles.size(); i++) {
out << "<html><head></head><body>";
out << "<p style=\"font-size:20pt\">" + titles.at(i) + "</p>";
out << "</body></html>"; …
Run Code Online (Sandbox Code Playgroud) 我在pyqt5中编写了一些代码,在main main中创建了一个表:
class Ui_MainWindow(object):
def setupUi(self, MainWindow): ...
def retranslateUi(self, MainWindow):...
self.pushButton.setText(_translate("MainWindow", "print"))
self.pushButton.clicked.connect(self.printer)
def printer(self):...
Run Code Online (Sandbox Code Playgroud)
并通过以下方式使用此类:
app = QtWidgets.QApplication(sys.argv)
MainWindow = QtWidgets.QMainWindow()
ui = Ui_MainWindow()
ui.setupUi(MainWindow)
MainWindow.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
我想知道如何从程序的主页打印?