gpt4 book ai didi

python - PDF 输出不适用于 Pyqt5 和 Python 3.5

转载 作者:太空宇宙 更新时间:2023-11-03 14:47:34 25 4
gpt4 key购买 nike

我已经为此测试了至少 20 种不同的解决方法。

我想打印一个小部件。

我的小部件是一个发票,它内部有很多其他小部件,例如 QLineEdits、带文本的 QLabels、充当图像的 QLabels、QDropDown 菜单等。这是一个屏幕截图(内部的所有数据(如 N.I.F)都是临时占位符真正的生意):

My invoice

所以这应该很容易,对吧?看来并非如此。

  1. 首先,我尝试将其发送给打印机,仅此一项就是一项非常艰巨的工作,需要处理许多不同的打印特定选项。经过所有研究,我发现 QPrintDialog 可以处理大部分内容
  2. 经过一段时间的测试,我注意到它很好地抓取了小部件,但它会将其打印到一个非常小的部分,因此经过大量研究,我找到了一种扩展它的方法,这就是我最终得到的结果。<

代码:

def print_as_pdf(widgettoprint):
# Printer
printer = QPrinter()
setupdialog = QPrintDialog(printer, widgettoprint)
if setupdialog.exec() == QPrintDialog.Accepted:
# Renderer
painter = QPainter(printer)
painter.begin(printer)
# Scale it
xscale = printer.pageRect().width() / widgettoprint.width()
yscale = printer.pageRect().height() / widgettoprint.height()
scale = min(xscale, yscale)
painter.translate(printer.paperRect().x() + printer.pageRect().width() / 2,
printer.paperRect().y() + printer.pageRect().height() / 2)
painter.scale(scale, scale)
painter.translate(-1 * widgettoprint.width() / 2, -1 * widgettoprint.height() / 2)
widgettoprint.render(painter)
painter.end()
return True
else:
return False

它确实成功了,它按预期打印了整个 A4 页面,但文本的质量相当糟糕。我发现它只是截取了屏幕截图,而不是将数据保存为文本或矢量数据。

所以这对我来说不起作用,但我必须尝试。我尝试使用相同的方法打印为 PDF(选择 PDF 作为打印机),它只是生成一个带有屏幕截图的 PDF。我无法选择或复制文本数据。

  • 因此我研究了替代方案。我发现了关于Reportlab但无法使其发挥作用。我也尝试过PyFPDF ,但特别是在不选择打印机的情况下创建 PDF 会破坏将发票实际打印到其他打印机的能力。
  • 好吧,我花了几天时间尝试寻找替代方案,而不是从头开始重建我的 7000 行代码程序。我发现this blog about jinja2 and qt解决方法并决定尝试一下。将整个发票重新创建为 HTML 模板将是一项相当大的工作量(因为有很多不同的发票,而不仅仅是这个)。但是出现了一个新问题,PyQt5 没有 QtWebKit 或 QWebView,据我所知,用此代码和 QtWebEngine 打印一个白色的空 PDF:
  • 代码:

    import os
    from jinja2 import Environment, FileSystemLoader
    from PyQt5 import QtWebEngineWidgets
    from PyQt5.QtPrintSupport import QPrinter, QPrintDialog
    from PyQt5.QtGui import QPainter

    PATH = os.path.dirname(os.path.abspath(__file__))
    TEMPLATE_ENVIRONMENT = Environment(
    autoescape=False,
    loader=FileSystemLoader(os.path.join(PATH, 'userfiles/templates')),
    trim_blocks=False)

    def render_template(template_filename, context):
    return TEMPLATE_ENVIRONMENT.get_template(template_filename).render(context)

    def test():
    something = ['something1', 'something2', 'something3']
    context = {
    'something': something,
    'invoicenumber': "17012"
    }
    # Generate the HTML data with the template without creating a file, on-the-fly
    html = render_template('invoices.html', context)

    # add html to a webengine/widget
    web = QtWebEngineWidgets.QWebEngineView()
    web.page().setHtml(html)

    # Print that widget
    printer = QPrinter()
    setupdialog = QPrintDialog(printer)
    if setupdialog.exec() == QPrintDialog.Accepted:
    web.render(printer)
    print("done")

    test()

    HTML 模板位于:

    <!DOCTYPE html>
    <html>
    <head>
    <meta charset="utf-8"/>
    <title>Factura {{ invoicenumber }}</title>
    </head>
    <body>
    <center>
    <h1>Factura {{ invoicenumber }}</h1>
    <p>{{ something|length }} something</p>
    </center>
    <ol align="left">
    {{ something[0] }}
    {{ something[1] }}
    {{ something[2] }}
    </ol>
    </body>
    </html>

    我可能会花费更多的时间和时间来尝试使其发挥作用。我认为打印应该非常简单,因为市场上的每个随机程序似乎都能够打印或创建 PDF,但现在对我来说这是我的编程学习经历中最糟糕的部分。

    目标:这个问题旨在找到我的问题的永久解决方案:如何将我的发票小部件打印到可选(Windows 平台)打印机?然后,如果选择 PDF 打印机,请使用矢量或任何不创建屏幕截图的方式以无限的质量打印它。

    我也希望能解释一下我做错了什么,因为我仍在学习(编程、Python 和 Qt)。

    最佳答案

    虽然我自己用Python编程,但我对用Python编程GUI知之甚少。不过,我发现了几个问题和网站,可以作为您自己实现的起点。我知道其中一些是 QT4,但是请看一下它们,我相信事情并没有改变那么多(但我可能是错的):
    Pyqt take screenshot of certain screen area
    Screenshot of a window using python
    QT documentation Screenshot example
    https://github.com/Python-Devs-Brasil/PyQt5-Tutorials/blob/master/Post-2(QtCore)/screenshot.py
    https://github.com/baoboa/pyqt5/blob/master/examples/desktop/screenshot.py
    How to grab a desktop screenshot with PyQt?

    编辑
    您是否尝试过通过 matplotlib 保存到 pdf 文件?
    https://pythonspot.com/en/matplotlib-save-figure-to-image-file/
    saving images in python at a very high quality

    编辑2
    另外,看看这个
    Create a pdf with fillable fields python

    编辑3
    您还可以查看此问题中提到的库的文档和示例
    Python PDF library

    关于python - PDF 输出不适用于 Pyqt5 和 Python 3.5,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46134250/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com