如何使用 Gtk 创建和打印文档(到打印机)?

How do I create and print a document (to a printer) using Gtk?

我想创建一个文档并使用我的 Gtk 3 应用程序将其打印到打印机。我正在使用 Python 3. 这是简化的代码:

import gi
import os

gi.require_version("Gtk", "3.0")

from gi.repository import Gtk, Pango

parent = Gtk.Window()

printers = os.popen("lpstat -e").read().strip().split("\n")
print("Available printers: %s" % printers)

printcontext = Gtk.PrintContext()
context = printcontext.create_pango_context()
layout = Pango.Layout.new(context)
layout.set_text("Hello!")
printsettings = Gtk.PrintSettings()
print("Printing to: %s" % printers[0])

printsettings.set_printer(printers[0])
printsettings.set_print_pages(Gtk.PrintPages.ALL)
printoperation = Gtk.PrintOperation().new()
printoperation.set_print_settings(printsettings)
print("Printing result: %s" % 
printoperation.run(Gtk.PrintOperationAction.PRINT, parent))

但是当我运行连接打印机时,它取消了操作:

Available printers: ['Canon-MF210-Series', 'HP_Officejet_5740_series_434FB1_']
Printing to: Canon-MF210-Series
Printing result: <enum GTK_PRINT_OPERATION_RESULT_CANCEL of type Gtk.PrintOperationResult>

为什么它在没有错误消息的情况下取消了 PrintOperation,我怎样才能让它正确打印?我的系统是 Ubuntu 20.04.2,如果有帮助的话。

你不能用 win32print 吗?

您所要做的就是

import os, sys, win32print

p = win32print.OpenPrinter(printer_name)
job = win32print.StartDocPrinter(p, 1, ("test of raw data", None, "RAW")) 

win32print.StartPagePrinter(p) 
win32print.WritePrinter(p, "data to print") 
win32print.EndPagePrinter(p)

尽管如果您需要使用 GTK,我认为所有打印选项都已停用。

推理:

编辑:

GTK 文档中唯一有效的打印操作是https://athenajc.gitbooks.io/python-gtk-3-api/content/gtk-group/gtkprintsettings.html

我找到了另一个解决方案!使用 cups 模块,您可以获得可用打印机的列表,select 一台,并向其打印文件!这是一个例子:

import cups
import cupshelpers

# Create a new connection and the list of available printers
connection = cups.Connection()
printers = cupshelpers.getPrinters(connection)

# Select the first printer in the list...
for p in printers:
    if p is not None:
        printer = printers[p]
        break

# ...and print to it
printer.connection.printFile(
    p,
    "printer_test.txt",
    "Test this printer",
    {}
)

这可以打印多种类型的文件,例如 PDF 和纯文本。如果我在 printer.connection.printFile() 函数中找到有关 options 字典的任何信息,我将更新此答案。不幸的是,这没有回答 how to create a file with Gtk 问题,但是有很多关于如何创建和编辑 PDF 的问题。

注意:不保证这适用于 Windows。如果你有 Windows,你可能想看看 Brody Critchlow 的答案。