rss· 投稿· 设为首页· 加入收藏· 繁體版
当前位置: 火魔网 » 程序开发 » Python

Python通过JPype调用ZXing生成二维码

作者: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图像后,扫出来的结果是:
以后再修改修改。
顶一下
(0)
踩一下
(0)