2011-06-13 288 views
6

我可以從PDF,PRN或PS文件開始。如何使用Python將其發送到USB打印機?我應該開始使用哪個模塊?使用Python將打印作業發送到USB打印機

+0

這的確是一個問題超級用戶網站。 – Keith 2011-06-13 02:02:20

+3

你說「USB」就好像它改變了問題。 – 2011-06-13 02:05:40

+9

@Ignacio:也許他認爲它做到了。我們都在這裏學習。 – mpen 2011-06-13 04:20:29

回答

2

這聽起來像你正在使用Windows,所以讓我們先從在於 - 如果您使用的是Linux,則應答更改。

在Windows中有兩種打印方法。第一種最常見的方式是通過Windows GDI接口發送各個繪圖命令。要做到這一點,您必須將每個單獨的元素放置在適當的位置(文本字符串,圖像和形狀),同時選擇正確的顏色和字體。如果您要自己生成數據,那麼很容易,如果您必須解析正在閱讀的文件,則要困難得多。

另一種選擇是以「原始」模式發送到打印機,打印機驅動程序基本上被旁路。爲了達到這個目的,打印機必須本地理解你提供給它的字節流。有一些打印機本身可以理解Postscript,但我不確定PDF,PRN不是標準格式。

我從來沒有過的Python做原料印刷自己,但這裏給的示例代碼很短的片段的鏈接(和問題的想法,希望):http://bytes.com/topic/python/answers/512143-printing-raw-postscript-data-windows

0
import wx 
import win32api 
import win32print 
class ComboBoxFrame(wx.Frame): 
    def __init__(self): 
     # creates a drop down with the list of printers available 
     wx.Frame.__init__(self, None, -1, 'Printers', size=(350, 300)) 
     panel = wx.Panel(self, -1) 
     list=[] 
     #Enum printers returns the list of printers available in the network 
     printers = win32print.EnumPrinters(
      win32print.PRINTER_ENUM_CONNECTIONS 
      + win32print.PRINTER_ENUM_LOCAL) 
     for i in printers: 
      list.append(i[2]) 
     sampleList = list 
     wx.StaticText(panel, -1, "Please select one printer from the list of printers to print:", (15, 15)) 
     self.combo =wx.ComboBox(panel, -1, "printers", (15, 40), wx.DefaultSize,sampleList, wx.CB_READONLY) 
     btn2 = wx.Button(panel, label="Print", pos=(15, 60)) 
     btn2.Bind(wx.EVT_BUTTON, self.Onmsgbox) 
     self.Centre() 
     self.Show() 

    def Onmsgbox(self, event): 
     filename='duplicate.docx' 
     # here the user selected printer value will be given as input 
     #print(win32print.GetDefaultPrinter()) 
     win32api.ShellExecute (
      0, 
      "printto", 
      filename, 
      '"%s"' % self.combo.GetValue(), 
      ".", 
      0 
     ) 
     print(self.combo.GetValue()) 


if __name__ =='__main__': 
    app = wx.App() 
    ComboBoxFrame().Show() 
    app.MainLoop() 
+0

代碼轉儲(技術上可能是正確的)並不一定幫助OP或未來的訪問者。我會通過解釋代碼來填補答案,即使代碼中的註釋也很有幫助。 – Bugs 2017-03-06 09:08:14