Issue 563: Support non-rectangular Data Matrix
[zxing.git] / core / test / data / blackbox / rssexpanded-3 / generate.py
1 #!/usr/bin/env python
2
3 import os
4 import glob
5 import sys
6 import subprocess
7 import traceback
8 import hashlib
9 import urllib
10 import urllib2
11
12 ZINT = 'zint'
13 ZINT_RSS_EXPANDED_CODE = 31
14 ZINT_BINARY = "zint" # If available in PATH
15
16 POSTSCRIPT = 'postscript'
17
18 TEST_FILE = "../../../src/com/google/zxing/oned/rss/RSSExpandedBlackBox3TestCase.java"
19
20 def check_zint():
21     try:
22         subprocess.Popen("zint", stdout=subprocess.PIPE, stderr=subprocess.PIPE)
23     except:
24         print >> sys.stderr, "zint not installed. Go to http://www.zint.org.uk/ and install it"
25         return False
26     return True
27
28 def check_postscript():
29     return True
30
31 GENERATORS = []
32 if check_zint():
33     GENERATORS.append(ZINT)
34 if check_postscript():
35     GENERATORS.append(POSTSCRIPT)
36
37 def generate_image_zint(image_filename, barcode):
38     braces_barcode = barcode.replace("(","[").replace(")","]")
39     os.system('%s -o %s -b %s -d "%s"' % (ZINT_BINARY, image_filename, ZINT_RSS_EXPANDED_CODE, braces_barcode.replace('"','\\"')))
40
41 def generate_image_postscript(image_filename, barcode):
42     hashname = "cache/%s.png" % hashlib.new("md5", barcode).hexdigest()
43     # If it exists in the cache, don't download it
44     if os.path.exists(hashname):
45         content = open(hashname).read()
46         open(image_filename,'w').write(content)
47         return
48
49     # We tried use the Python, Perl and LaTeX bindings without success :-(
50     baseurl = "http://www.terryburton.co.uk/barcodewriter/generator/"
51     encoded = urllib.urlencode({
52              "encoder"     : "rssexpanded",
53              "data"        : barcode,
54              "options"     : "",
55              "translate_x" : "50", "translate_y" : "50",
56              "scale_x"     : "2", "scale_y"     : "2",
57              "rotate"      : "0", "submit"      : "Make Barcode"
58          })
59     web_urlobject = urllib2.urlopen(baseurl, data = encoded)
60     web_content   = web_urlobject.read()
61     png_url       = web_content.split('">PNG</a>')[0].split('<a href="')[-1]
62     if not png_url.startswith("tmp"):
63         raise Exception("There was an error processing barcode %s in postscript" % barcode)
64     full_url      = baseurl + png_url
65     png_content   = urllib2.urlopen(full_url).read()
66     open(hashname,'w').write(png_content)
67     open(image_filename,'w').write(png_content)
68
69 def generate_image(image_filename, barcode, generator):
70     if generator == ZINT:
71         generate_image_zint(image_filename, barcode)
72     elif generator == POSTSCRIPT:
73         generate_image_postscript(image_filename, barcode)
74     else:
75         raise Exception("Unknown generator: %s" % generator)
76
77 def extract_barcodes():
78     for line in open("generation.config"):
79         content = line.split("#")[0].strip()
80         if content != "":
81             if content[0] == '-':
82                 pos = content[1:].find('-')
83                 exceptions = content[1:pos+1].split(",")
84                 barcode = content[pos + 2:]
85                 yield exceptions, barcode
86             else:
87                 yield (), content
88
89 if __name__ == '__main__':
90     counter = 0
91
92     for image_to_delete in glob.glob("*.png"):
93         os.remove(image_to_delete)
94
95     for text_to_delete in glob.glob("*.txt"):
96         os.remove(text_to_delete)
97
98     for generator in GENERATORS:
99         for exceptions, barcode in extract_barcodes():
100             if generator in exceptions:
101                 continue
102             try:
103                 counter += 1
104                 image_filename = str(counter) + ".png"
105                 text_filename  = str(counter) + ".txt"
106                 open(text_filename, "w").write(barcode)
107                 generate_image(image_filename, barcode, generator)
108             except Exception:
109                 print "Error with generator %s and barcode %s" % (generator, barcode)
110                 traceback.print_exc()
111                 counter -= 1
112
113     open(TEST_FILE,'w').write("""package com.google.zxing.oned.rss;
114
115 import com.google.zxing.BarcodeFormat;
116 import com.google.zxing.MultiFormatReader;
117 import com.google.zxing.common.AbstractBlackBoxTestCase;
118
119 public class RSSExpandedBlackBox3TestCase extends AbstractBlackBoxTestCase {
120     
121     public RSSExpandedBlackBox3TestCase() {
122         super("test/data/blackbox/rssexpanded-3", new MultiFormatReader(), BarcodeFormat.RSS_EXPANDED);
123         addTest(%(number)s, %(number)s, 0.0f);
124         addTest(%(number)s, %(number)s, 180.0f);
125     }
126 }
127     """ % {"number" : counter})
128