使用Python和;GSPrint不工作
我一直在尝试通过Win32API模块和GSPrint打印用Reportlab创建的PDF文档 使用命令行工作起来很轻松,但是当我使用使用Python和;GSPrint不工作,python,node.js,pdf,printing,Python,Node.js,Pdf,Printing,我一直在尝试通过Win32API模块和GSPrint打印用Reportlab创建的PDF文档 使用命令行工作起来很轻松,但是当我使用Win32API.ShellExecute()时,似乎什么都没有打印出来 以下是我在创建PDF时调用的代码;filename=tempfile.mktemp(“.pdf”)用于创建临时pdf hInstance = win32api.ShellExecute( 0, "open", "gsprint.exe", '-printer "HP Laser
Win32API.ShellExecute()
时,似乎什么都没有打印出来
以下是我在创建PDF时调用的代码;filename=tempfile.mktemp(“.pdf”)
用于创建临时pdf
hInstance = win32api.ShellExecute(
0,
"open",
"gsprint.exe",
'-printer "HP LaserJet 3055 PCL6 Class Driver" ' + filename,
".",
0
)
print filename
handleInstanceID也是返回值,即42,但没有任何内容进入打印机
设置是这样的,使用NodeJS将JSON数据传递给使用STDIN的Python,我使用了pythonshell
模块。当python脚本接收到一个JSON文档时,它会在一个临时文件中使用ReportLab创建一个PDF,然后调用ShellExecute,将hInstance代码返回给NodeJS
了解一下这一点会很有帮助
NodeJS应用程序正在使用节点窗口作为Windows服务运行
NodeJS脚本
app.post('/printKot', function (req, res) {
var scriptP = path.join(process.cwd(), 'myPythonScripts', 'demo.py');
//res.json({path: path.join(process.cwd(), 'myPythonScripts')});
var pyshell = new PythonShell('printKot.py', {scriptPath: "C:\\\\Users\\\\Sid\\\\posistFineDine\\\\myPythonScripts" });
// sends a message to the Python script via stdin
//pyshell.send(JSON.stringify(req.body.billYoData));
var kotData = '{"billdata":{"Tp":"Rooftop Table","TN":10,"KN":11,"BN":"12","BD":"2015-06-17T15:09:58.439Z","Name":"","Add":"","St":"","Cy":"","Sta":"","Pin":"","PNm":"","MNm":"","Waiter":"Waiter Sid Gomez","DAmt":0,"Ft":"","WU":false},"billitemsdata":[{"N":"Chilli Bites Potato","Q":1,"R":0,"W":0,"U":""},{"N":"Chicken Ninja ","Q":1,"R":0,"W":0,"U":""},{"N":"Chilli Bites Ckn","Q":1,"R":0,"W":0,"U":""}],"billtaxesdata":[{"N":null,"A":0}],"subtotal":0,"totalTax":0,"roundOff":0,"grandTotal":0,"totalQuantity":3,"iskot":true,"printername":null,"copies":2,"printertype":null}'
pyshell.send(kotData);
pyshell.on('message', function (message) {
//console.log(message);
console.log("Printed");
res.json({msg: message});
});
pyshell.end(function (err) {
console.log(err);
});
console.log("Printed last")
//res.json({msg:true});*/
});
Python脚本
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4, cm, letter
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.platypus import Paragraph, Table, TableStyle
from reportlab.lib.enums import TA_JUSTIFY, TA_LEFT, TA_CENTER, TA_RIGHT
from reportlab.lib import colors
import json
import tempfile
import win32api
import win32print
import sys
import base64
import os
import subprocess
#jsonData = sys.stdin
#kotObject ='{"billdata":{"Tp":"Table","TN":14,"KN":6,"BN":"16","BD":"2015-06-12T12:57:11.844Z","Name":"","Add":"","St":"","Cy":"","Sta":"","Pin":"","PNm":"","MNm":"","Waiter":"Waiter Sid Gomez","DAmt":0,"Ft":"","WU":false},"billitemsdata":[{"N":"Chow Manchow Chicken","Q":1,"R":0,"W":0,"U":""},{"N":"Double Corn Chicken","Q":1,"R":0,"W":0,"U":""},{"N":"Double Corn Veg","Q":1,"R":0,"W":0,"U":""},{"N":"Whopping Wonton Soup Veg ","Q":1,"R":0,"W":0,"U":""}],"billtaxesdata":[{"N":null,"A":0}],"subtotal":0,"totalTax":0,"roundOff":0,"grandTotal":0,"iskot":true,"totalQuantity": 0, "printername":null,"copies":2,"printertype":null}'
bill = json.load(sys.stdin)
#bill = json.loads(kotObject)
filename = tempfile.mktemp(".pdf")
itemLen = len(bill['billitemsdata'])
taxLen = len(bill['billtaxesdata'])
width, height = A4
styles = getSampleStyleSheet()
styles.add(ParagraphStyle(name='HeaderFooter', fontName ='Helvetica',fontSize=10, alignment=TA_CENTER))
styles.add(ParagraphStyle(name='RightAlignedValueAmount', fontName ='Helvetica',fontSize=10, alignment=TA_RIGHT))
styles.add(ParagraphStyle(name='Details', fontName ='Helvetica', fontSize=10, alignment=TA_CENTER))
styles.add(ParagraphStyle(name='LeftAligned', fontName='Helvetica', fontSize=10, alignment=TA_LEFT))
def coord(x, y, unit=1):
x, y = x * unit, height - y * unit
return x, y
hItem = Paragraph('''<b>Items</b>''', styles["LeftAligned"])
hQty = Paragraph('''<b>Qty</b>''', styles["RightAlignedValueAmount"])
hRate = Paragraph('''<b>Qty</b>''', styles["RightAlignedValueAmount"])
data = []
data.append([Paragraph('Type: <b>%s</b>' % bill['billdata']['Tp'], styles["LeftAligned"]), '', ''])
data.append([Paragraph('KOT Number: <b>%s</b>' % bill['billdata']['KN'], styles["LeftAligned"]), '', ''])
data.append([Paragraph('Bill Number: <b>%s</b>' % bill['billdata']['BN'], styles["LeftAligned"])])
data.append([Paragraph('Date: <b>%s</b>' % bill['billdata']['BD'], styles["LeftAligned"])])
data.append([hItem, '', hQty])
for item in bill['billitemsdata']:
data.append([Paragraph('%s' % item['N'], styles["LeftAligned"]), '', Paragraph('%s' % item['Q'], styles["RightAlignedValueAmount"])])
data.append(['','',''])
data.append([Paragraph('<b>Total Qty:</b>', styles["LeftAligned"]), '', Paragraph('%s' % bill['totalQuantity'], styles["RightAlignedValueAmount"])])
table = Table(data, colWidths=[5 * cm, 1 * cm, 2 * cm])
table.setStyle(TableStyle([
('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
('SPAN', (0,0),(2,0)),
('SPAN',(0,1), (2,1)),
('SPAN',(0,2), (2,2)),
('SPAN',(0,3), (2,3)),
("LINEBELOW", (0, 3), (-1, 3), 1, colors.black, None, (1,2,3)),
("LINEBELOW", (0, 4), (-1, 4), 1, colors.black, None, (2,2,4)),
#('SPAN', (0,-1), (2,-1)),
#('SPAN', (0,2), (-1,2)),
#("LINEBELOW", (0, 3), (-1, 3), 1, colors.black, None, (1,2,3)),
#("LINEBELOW", (0,itemLen+3),(-1,itemLen+3),1, colors.black, None, (1,2,3))
#("LINEABOVE", (0, -1), (2, -1), 1, colors.black),
#("LINEBELOW", (0, -1), (2, -1), 1, colors.black),
#('INNERGRID', (0,0), (-1,-1), 0.25, colors.blue),
#('BOX', (0,0), (-1,-1), 0.25, colors.red)
]))
c = canvas.Canvas(filename, pagesize=A4)
#c.line(10,0,10,height)
#c.setFont('Helvetica', 12)
#c.drawString(10,840-cm,"Welcome to Reportlab!")
#print "Width %s" % width
#print "Height %s" % height
#print "CM %s" % cm
w, h = table.wrap(0, 0)
#print "Table Width %s" % w
#print "Table Height %s" % h
table.wrapOn(c, width, height)
table.drawOn(c, 10, height-(h+cm+80))
c.save()
# if sys.version_info >= (3,):
# raw_data = bytes ("This is a test", "utf-8")
# else:
# raw_data = "This is a test"
# printer_name = 'HP LaserJet 3055 PCL6 Class Driver'
# hPrinter = win32print.OpenPrinter (printer_name)
# try:
# hJob = win32print.StartDocPrinter (hPrinter, 1, ("test of raw data", None, "RAW"))
# try:
# win32print.StartPagePrinter (hPrinter)
# win32print.WritePrinter (hPrinter, raw_data)
# win32print.EndPagePrinter (hPrinter)
# finally:
# win32print.EndDocPrinter (hPrinter)
# finally:
# win32print.ClosePrinter (hPrinter)
hInstance = win32api.ShellExecute(
0,
"open",
"gsprint",
'-printer "HP LaserJet 3055 PCL6 Class Driver" ' + '"%s"' % filename,
".",
0
)
print filename
从reportlab.pdfgen导入画布
从reportlab.lib.pagesizes导入A4、厘米、字母
从reportlab.lib.styles导入getSampleStyleSheet、ParagraphStyle
从reportlab.platypus导入段落、表格、表格样式
从reportlab.lib.enums导入TA_JUSTIFY、TA_LEFT、TA_CENTER、TA_RIGHT
从reportlab.lib导入颜色
导入json
导入临时文件
导入win32api
导入win32print
导入系统
导入base64
导入操作系统
导入子流程
#jsonData=sys.stdin
#kotObject=“{”billdata:“{”Tp:“Table”,“PNm:“MNm:“water:“water:“water:”Sid Gomez”,“DAmt:”0,“Ft:”WU:”false:”billitestdata:“{”N:“Chow Manchow Chicken”,“Q:”1,“R:”0,“W:”U:“,”N:”N:”双玉米“,”Q:”0“,”W:”,”N:“,”N:”N:“,”N:”N:”N:”N:”N:”N:”N:”N:“,”N:”N:”N:”N:“N:”N:“N:“N:”N:”N:“N:”N:“N:“N:”N:“N:“N:”N{“N:“双份玉米蔬菜”,“Q”:1,“R”:0,“W”:0,“U”:“},{”N:“大馄饨汤蔬菜”,“Q”:1,“R”:0,“W”:0,“U”:“}],“billtaxesdata”:[{”N:“空”,A:“0}],“小计”:0,“总税”:0,“舍入”:0,“总税”:0,“iskot”:真,“总数量”:0,“打印名称”:空,“复印件”:2,“打印类型”:空}”
bill=json.load(sys.stdin)
#bill=json.loads(kotObject)
filename=tempfile.mktemp(“.pdf”)
itemLen=len(账单['billitemsdata'])
taxLen=len(账单['billtaxesdata'])
宽度、高度=A4
styles=getSampleStyleSheet()
添加(段落样式(name='HeaderFooter',fontName='Helvetica',fontSize=10,alignment=TA_-CENTER))
添加(段落样式(name='RightAlignedValueAmount',fontName='Helvetica',fontSize=10,alignment=TA_RIGHT))
添加(段落样式(name='Details',fontName='Helvetica',fontSize=10,alignment=TA_CENTER))
添加(段落样式(name='LeftAligned',fontName='Helvetica',fontSize=10,alignment=TA_LEFT))
def坐标(x,y,单位=1):
x、 y=x*单位,高度-y*单位
返回x,y
hItem=段落(“'Items'”,样式[“LeftAligned”])
hQty=段落(“数量”,样式[“RightAlignedValueAmount”])
hRate=段落(“数量”,样式[“RightAlignedValueAmount”])
数据=[]
数据.append([段落('类型:%s'%bill['billdata']['Tp'],样式[“LeftAligned”]),'','',])
数据。追加([段落('KOT编号:%s'%bill['billdata']['KN'],样式[“LeftAligned”],'','')
数据.追加([段落('票据编号:%s'%Bill['billdata']['BN'],样式[“LeftAligned”]))
数据。追加([段落('日期:%s'%bill['billdata']['BD'],样式[“LeftAligned”]))
数据追加([hItem',hQty])
对于账单中的项目['billitemsdata']:
数据。追加([段落(“%s”%item['N'],样式[“LeftAligned”]),“”,段落(“%s”%item['Q'],样式[“RightAlignedValueAmount”]))
data.append(['',''))
数据.追加([段落('Total Quantity:',样式[“LeftAligned”]),'',段落('%s'%bill['totalQuantity'],样式[“RightAlignedValueAmount”]))
表=表(数据,冷宽=[5*cm,1*cm,2*cm])
表.setStyle(表样式([
('VALIGN',(0,0),(-1,-1),'MIDDLE'),
(‘SPAN’,(0,0),(2,0)),
(‘SPAN’,(0,1),(2,1)),
(‘SPAN’,(0,2),(2,2)),
(‘SPAN’,(0,3),(2,3)),
((-1,3),1,颜色。黑色,无,(1,2,3)),
((-1,4),1,颜色。黑色,无,(2,2,4)),
#(‘SPAN’,(0,-1),(2,-1)),
#('SPAN',(0,2),(-1,2)),
#((-1,3),1,颜色。黑色,无,(1,2,3)),
#(“linedown”,(0,itemLen+3),(-1,itemLen+3),1,colors.black,None,(1,2,3))
#(“LINEABOVE”,(0,-1),(2,-1),1,颜色。黑色),
#(“线下“,(0,-1),(2,-1),1,颜色。黑色),
#('INNERGRID',(0,0),(-1,-1),0.25,颜色。蓝色),
#('BOX',(0,0),(-1,-1),0.25,颜色。红色)
]))
c=canvas.canvas(文件名,页面大小=A4)
#c、 线(10,0,10,高度)
#c、 setFont('Helvetica',12)
#c、 抽绳(10840厘米,“欢迎来到Reportlab!”)
#打印“宽度%s”%Width
#打印“高度%s”%Height
#打印“厘米%s”%CM
w、 h=表。换行(0,0)
#打印“表格宽度%s”%w
#打印“表格高度%s”%h
表2.wrapOn(c、宽度、高度)
表.图纸(c,10,高度-(h+cm+80))
c、 保存()
#如果sys.version_info>=(3,):
#原始数据=字节(“这是一个测试”,“utf-8”)
#其他:
#原始数据=“这是一项测试”
#打印机名称='HP LaserJet 3055 PCL6类驱动程序'
#hPrinter=win32print.OpenPrinter(打印机名称)
#尝试:
#hJob=win32print.StartDocPrinter(hPrinter,1,(“原始数据测试”,无,“原始”))
#尝试:
#win32print.StartPagePrinter(hPrinter)
#win32print.WritePrinter(HPPrinter,原始数据)
#win32print.EndPagePrinter(HPPrinter)
#最后:
#win32print.EndDocPrinter(HPPrinter)
#最后:
#win32print.ClosePrinter(HPPrinter)
hInstance=win32api.ShellExecute(
0,
“开放”,
“gsprint”,
'-printer“HP LaserJet 3055 PCL6类驱动程序”'+'%s''%filename,
".",
0
)
打印文件名
T