作者:xialulee
最初发布于:2011年9月24日,http://blog.sina.com.cn/xialulee
在班上没有联网的电脑上看文档时,有时出现一些链接。以前还得手工把这些链接抄下来,然后到联网的电脑上输入,打开,好麻烦。后来看了,发现除了用于解码,ZXing还能生成二维码图像,于是用Python写了如下的脚本。由于ZXing是Java写的,所以需要借助JPype的力量。利用这个脚本,在没有联网的机器上,可以将里面的链接什么的生成二维码,然后用Anroid设备扫描一下,就可以打开了。
#!/usr/bin/env python
# barcodegen.pyimport os
import sys
import getopt
import webbrowser
from jpype import java, startJVM, shutdownJVM, getDefaultJVMPath, JClass# --2011.09.23 PM 11:25 Created by xialulee--
ERROR_NOERROR, ERROR_PARAM, ERROR_CLIPB = range(3)def usage():
perr = sys.stderr.write
perr('Usage: {0} [options]\n'.format(os.path.split(sys.argv[0])[-1]))
perr('Generate barcode from contents of stdin\n')
perr('\n')
perr(' --height=integer\theight of barcode picture\n')
perr(' --width=integer\twidth of barcode picture\n')
perr(' --decode=CODE\tuse code to decode string from stdin\n')
perr(' --filename=string\tfile name of barcode picture\n')
perr(' --format=string\tchoose barcode format from the list\n')
## perr('\t\tAZTEC\n')
## perr('\t\tCODABAR\n')
## perr('\t\tCODE_39\n')
## perr('\t\tCODE_93\n')
## perr('\t\tCODE_128\n')
## perr('\t\tDATA_MATRIX\n')
## perr('\t\tEAN_8\n')
## perr('\t\tEAN_13\n')
## perr('\t\tITF\n')
## perr('\t\tPDF_417\n')
perr('\t QR_CODE\n')
## perr('\t\tRSS_14\n')
## perr('\t\tRSS_EXPANDED\n')
## perr('\t\tUPC_A\n')
## perr('\t\tUPC_E\n')
## perr('\t\tUPC_EAN_EXTENSION\n')
perr(' --show\t\tshow the barcode picture immediately\n')
perr(' -h, --help\t\tdisplay this help and exit\n')def str2barcode(s, format, width, height):
MultiFormatWriter = JClass('com.google.zxing.MultiFormatWriter')
writer = MultiFormatWriter()
BarcodeFormat = JClass('com.google.zxing.BarcodeFormat')
matrix = writer.encode(s, getattr(BarcodeFormat, format), width, height)
return matrixdef barcode2file(filename, matrix):
f = java.io.File(filename)
JClass('com.google.zxing.client.j2se.MatrixToImageWriter').\
writeToFile(matrix, 'png', f)
def main():
mypath, myname = os.path.split(sys.argv[0])
try:
opts, args = getopt.getopt(sys.argv[1:], \
'h', \
['height=', 'width=', 'decode=', 'filename=', 'format=', 'show', 'help'] \
except getopt.GetoptError, err:
sys.stderr.write(str(err)+'\n')
usage()
sys.exit(ERROR_PARAM)
height = 400
width = 400
filename= None
format = 'QR_CODE'
strcode = None
show = False
for o, a in opts:
if o in ('-h', '--help'):
usage()
exit(ERROR_NOERROR)
if o == '--height':
height = int(a)
if o == '--width':
width = int(a)
if o == '--decode':
strcode = a
if o == '--filename':
filename = a
if o == '--format':
format = a
if o == '--show':
show = True
try:
startJVM(getDefaultJVMPath(), '-Djava.class.path={0}'.format(os.path.join(mypath, 'zxing.jar')))
s = sys.stdin.read()
if strcode:
s = s.decode(strcode)
barcode2file(filename, str2barcode(s, format, width, height))
if show:
webbrowser.open(filename)
finally:
shutdownJVM()if __name__ == '__main__':
main()
该脚本参考了中的Java代码。简单说明一下。上面的脚本并不能直接使用,首先得从ZXing的网站上下载源码,编译,然后将编译好的文件打包成zxing.jar,和上面的脚本文件放在同一个目录中,方能使用。
-h,
--help:
显示帮助
--height=: 设定生成图像的高度
--width=:
设定生成图像的宽度
--filename=:
设定生成的图像的路径和文件名
--format=: 设定Barcode格式
--show:
在脚本结束时用操作系统默认的图像查看器显示生成的Barcode图像
--decode=:
当输入的文本含有非ascii字符时,设定编码,比如--decode=gbk之类的
值得说明的是--width和--height不是必须的,默认为400x400;--format也不是必须的,默认为QR_CODE,而且实际上这个脚本目前只能生成QR_CODE类型的Barcode;--show的功能是通过webbrowser
module的open实现的。
在设定好参数,运行脚本后,即可通过stdin输入文本。可以配合管道使用。比如在Windows平台上,可以用如下的方式将clipboard中的文本生成QR_CODE图像:
clipb.py -r | barcodegen.py --filename=codebar.png --show
其中clipb.py的代码参见。
在正确配置了Java的情况下,该脚本可以在多个平台上执行。下图是在Win7上的效果:
下图是在Ubuntu上的效果:
值得说明的是,虽然脚本配置了--decode参数,可以用于含有中文的文本,但是实际上还不能正确处理中文,比如,将“测试ZXing”生成QR_CODE图像后,扫出来的结果是:
以后再修改修改。