如何使用 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 的答案。
我想创建一个文档并使用我的 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 的答案。