bwipp_dump-barcode.ps.cat 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. %!PS
  2. % libzint - the open source barcode library
  3. % Copyright (C) 2022-2023 Robin Stuart <rstuart114@gmail.com>
  4. % SPDX-License-Identifier: BSD-3-Clause
  5. % Append to BWIPP barcode.ps: cat <bwipp-dir>/build/monolithic/barcode.ps bwipp_dump-barcode.ps.cat > bwipp_dump.ps
  6. %
  7. % To compress: tar cv bwipp_dump.ps | xz -e9 > bwipp_dump.ps.tar.xz
  8. % Dumps BWIPP barcode binary to stdout. If `-sn` given, appends a newline after each symbol row, otherwise doesn't.
  9. %
  10. % To run e.g. gs -dNOPAUSE -dBATCH -dNODISPLAY -q -sb=databarexpanded -sd='(01)98898765432106' -so='includetext segments=6' bwipp_dump.ps
  11. % where
  12. % `-sb=` is the BWIPP barcode routine name
  13. % `-sd=` is the data (`sd2=`, `sd3=`, `sd4=` are also available for overspill data > ~2K to get around Ghostscript's arg_str_max)
  14. % `-so=` are options (as space separated key=val pairs (or just key if boolean true))
  15. % For debugging the barcode can be rendered by leaving out `-dBATCH -dNODISPLAY`. Scaling can be specified by `-ss=` (default 2).
  16. % Command line "-s" options put into system dictionary as strings
  17. /n systemdict /n known def
  18. % Append d2 to d if given
  19. systemdict /d2 known {
  20. /d d length d2 length add string dup dup 0 d putinterval d length d2 putinterval def
  21. % Append d3 to d if given
  22. systemdict /d3 known {
  23. /d d length d3 length add string dup dup 0 d putinterval d length d3 putinterval def
  24. % Append d4 to d if given
  25. systemdict /d4 known {
  26. /d d length d4 length add string dup dup 0 d putinterval d length d4 putinterval def
  27. } if
  28. } if
  29. } if
  30. % Strip start/end parens from data if any
  31. d 0 1 getinterval (\() eq d d length 1 sub 1 getinterval (\)) eq and {
  32. /d d 1 d length 2 sub getinterval d length 2 sub string copy def
  33. } if
  34. % Options
  35. systemdict /o known {
  36. o type /stringtype eq o length 0 gt and {
  37. o length 2 ge {
  38. % Strip start/end parens from options if any
  39. o 0 1 getinterval (\() eq o o length 1 sub 1 getinterval (\)) eq and {
  40. /o o 1 o length 2 sub getinterval o length 2 sub string copy def
  41. } if
  42. } if
  43. 3 dict begin
  44. o {
  45. token not {exit} if
  46. dup length string cvs (=) search {
  47. cvlit exch pop exch def
  48. } {
  49. cvlit true def
  50. } ifelse
  51. } loop
  52. currentdict end /o exch def
  53. } {
  54. /o 1 dict def
  55. } ifelse
  56. } {
  57. /o 1 dict def
  58. } ifelse
  59. o (dontdraw) true put
  60. /ret d o b cvn /uk.co.terryburton.bwipp findresource exec def
  61. % pixs is renmatrix input
  62. ret /pixs known {
  63. b (maxicode) eq {
  64. /pixs 990 array def
  65. 0 1 989 { pixs exch 0 put } for
  66. ret /pixs get { pixs exch 1 put } forall
  67. } {
  68. /pixs ret /pixs get def
  69. } ifelse
  70. /pixx ret /pixx known { ret /pixx get } { 0 } ifelse def
  71. b (codablockf) eq b (hibccodablockf) eq or b (code16k) eq or b (code49) eq or {
  72. % Strip separators and boundary bars
  73. /testi b (code16k) eq { 16 } { b (code49) eq { 11 } { 21 } ifelse } ifelse def
  74. /tmppixs pixs length array def
  75. /j 0 def
  76. 0 pixx pixs length 1 sub {
  77. /i exch def
  78. pixs i testi add get 1 ne {
  79. tmppixs j pixs i pixx getinterval putinterval
  80. /j j pixx add def
  81. } if
  82. } for
  83. /pixs j array def
  84. pixs 0 tmppixs 0 j getinterval putinterval
  85. } if
  86. /xs systemdict /xs known { systemdict /xs get cvi } { 0 } ifelse def
  87. /xe systemdict /xe known { systemdict /xe get cvi } { 0 } ifelse def
  88. n xs 0 ne or xe 0 ne or pixx 0 ne and { % If newlines or start/end indexes requested and have row width
  89. /pixx ret /pixx get def
  90. xs pixx pixs length 1 sub xe sub { % For i = xs; i < pixs length - xe; i += pixx
  91. pixs exch pixx xs sub xe sub getinterval { % For j = i; j < i + pixx - xs -xe; j++
  92. 1 string cvs print
  93. } forall
  94. n { (\n) print } if
  95. } for
  96. } { % Else dump the whole thing, no newlines
  97. pixs { 1 string cvs print } forall
  98. } ifelse
  99. } {
  100. % sbs is renlinear input
  101. ret /sbs known {
  102. /sbs ret /sbs get def
  103. % Check if given preprocessor override
  104. systemdict /p known {
  105. /p systemdict /p get cvx def
  106. } {
  107. /p { false } def
  108. } ifelse
  109. % Check if given ratio arg to adjust width of bars/spaces (e.g. "0.6" reduces 3 -> 2, "1.3" increases 2 -> 3)
  110. systemdict /r known {
  111. /r systemdict /r get cvr def
  112. systemdict /c known { % Apply ceiling ratio beforehand
  113. /c systemdict /c get cvr def
  114. /f { c mul ceiling cvi r mul round cvi } def
  115. } {
  116. /f { r mul round cvi } def
  117. } ifelse
  118. } {
  119. /f {} def
  120. } ifelse
  121. % If should begin with space
  122. systemdict /bs known { (0) print } if
  123. % If should end sbs loop on bar (i.e. ignore last index of even-length sbs)
  124. /limit systemdict /elb known {
  125. sbs length 1 add 2 idiv 2 mul 2 sub
  126. } {
  127. sbs length 1 sub
  128. } ifelse def
  129. /nosbs false def
  130. % Check for pharmacode2
  131. b (pharmacode2) eq {
  132. /nosbs true def
  133. /bhs ret /bhs get def
  134. /bbs ret /bbs get def
  135. 0 1 bbs length 1 sub {
  136. /i exch def
  137. i 0 ne { (0) print } if
  138. bbs i get 0.1 lt {
  139. bhs i get 0.3 gt { (1) print } { (0) print } ifelse
  140. } {
  141. bhs i get 0.1 gt { (1) print } { (0) print } ifelse
  142. } ifelse
  143. } for
  144. n { (\n) print } if
  145. 0 1 bbs length 1 sub {
  146. /i exch def
  147. i 0 ne { (0) print } if
  148. bbs i get 0.1 lt {
  149. bhs i get 0.1 gt { (1) print } { (0) print } ifelse
  150. } {
  151. bhs i get 0.3 gt { (1) print } { (0) print } ifelse
  152. } ifelse
  153. } for
  154. n { (\n) print } if
  155. } if
  156. % Check for 2-track postal
  157. b (postnet) eq b (planet) eq or {
  158. /nosbs true def
  159. /bhs ret /bhs get def
  160. 0 1 bhs length 1 sub {
  161. /i exch def
  162. i 0 ne { (0) print } if
  163. bhs i get 0.1 gt { (1) print } { (0) print } ifelse
  164. } for
  165. n { (\n) print } if
  166. 0 1 bhs length 1 sub {
  167. /i exch def
  168. i 0 ne { (0) print } if
  169. bhs i get 0.01 lt { (0) print } { (1) print } ifelse
  170. } for
  171. n { (\n) print } if
  172. } if
  173. % Check for 4-track postal
  174. b (auspost) eq b (kix) eq or b (royalmail) eq or b (onecode) eq or b (japanpost) eq or b (daft) eq or {
  175. /nosbs true def
  176. /bhs ret /bhs get def
  177. /bbs ret /bbs get def
  178. 0 1 bbs length 1 sub {
  179. /i exch def
  180. i 0 ne { (0) print } if
  181. bbs i get 0.05 lt {
  182. bhs i get 0.14 gt { (1) print } { (0) print } ifelse
  183. } {
  184. bhs i get 0.09 gt { (1) print } { (0) print } ifelse
  185. } ifelse
  186. } for
  187. n { (\n) print } if
  188. 0 1 bbs length 1 sub {
  189. /i exch def
  190. i 0 ne { (0) print } if
  191. (1) print
  192. } for
  193. n { (\n) print } if
  194. 0 1 bbs length 1 sub {
  195. /i exch def
  196. i 0 ne { (0) print } if
  197. bbs i get 0.05 lt {
  198. bhs i get 0.09 gt { (1) print } { (0) print } ifelse
  199. } {
  200. (0) print
  201. } ifelse
  202. } for
  203. n { (\n) print } if
  204. } if
  205. % Process sbs
  206. nosbs not {
  207. 0 1 limit {
  208. /i exch def
  209. p not { % If not preprocessed
  210. i 2 mod 0 eq { % i is even
  211. sbs i get f cvi { (1) print } repeat
  212. } {
  213. sbs i get f cvi { (0) print } repeat
  214. } ifelse
  215. } if
  216. } for
  217. n { (\n) print } if
  218. } if
  219. } if
  220. } ifelse
  221. % If have renderer
  222. ret /ren known {
  223. % Scale
  224. /s systemdict /s known { systemdict /s get cvi } { 2 } ifelse def
  225. % If not -dNODISPLAY then render for debugging
  226. currentpagedevice /Name get (nullpage) ne { s s scale 10 10 moveto ret ret /ren get exec } if
  227. } if
  228. % vim: set ts=4 sw=4 et :