Commit 6100c2a5d781d1ac261195db53af7fa6685e1e10
commit from v0.1 tarball
Caleb Maclennan committed on 3/10/2014, 9:03:38 PMFiles changed
AUTHORS | added |
COPYING | added |
ChangeLog | added |
News | added |
README | added |
TODO | added |
example_check.ps | added |
freecheck.cfg | added |
freecheck.pl | added |
AUTHORS | ||
---|---|---|
@@ -1,0 +1,4 @@ | ||
1 … | +freecheck is written by: | |
2 … | + | |
3 … | +Eric Sandeen <eric_sandeen@bigfoot.com> | |
4 … | + |
COPYING | ||
---|---|---|
@@ -1,0 +1,340 @@ | ||
1 … | + GNU GENERAL PUBLIC LICENSE | |
2 … | + Version 2, June 1991 | |
3 … | + | |
4 … | + Copyright (C) 1989, 1991 Free Software Foundation, Inc. | |
5 … | + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
6 … | + Everyone is permitted to copy and distribute verbatim copies | |
7 … | + of this license document, but changing it is not allowed. | |
8 … | + | |
9 … | + Preamble | |
10 … | + | |
11 … | + The licenses for most software are designed to take away your | |
12 … | +freedom to share and change it. By contrast, the GNU General Public | |
13 … | +License is intended to guarantee your freedom to share and change free | |
14 … | +software--to make sure the software is free for all its users. This | |
15 … | +General Public License applies to most of the Free Software | |
16 … | +Foundation's software and to any other program whose authors commit to | |
17 … | +using it. (Some other Free Software Foundation software is covered by | |
18 … | +the GNU Library General Public License instead.) You can apply it to | |
19 … | +your programs, too. | |
20 … | + | |
21 … | + When we speak of free software, we are referring to freedom, not | |
22 … | +price. Our General Public Licenses are designed to make sure that you | |
23 … | +have the freedom to distribute copies of free software (and charge for | |
24 … | +this service if you wish), that you receive source code or can get it | |
25 … | +if you want it, that you can change the software or use pieces of it | |
26 … | +in new free programs; and that you know you can do these things. | |
27 … | + | |
28 … | + To protect your rights, we need to make restrictions that forbid | |
29 … | +anyone to deny you these rights or to ask you to surrender the rights. | |
30 … | +These restrictions translate to certain responsibilities for you if you | |
31 … | +distribute copies of the software, or if you modify it. | |
32 … | + | |
33 … | + For example, if you distribute copies of such a program, whether | |
34 … | +gratis or for a fee, you must give the recipients all the rights that | |
35 … | +you have. You must make sure that they, too, receive or can get the | |
36 … | +source code. And you must show them these terms so they know their | |
37 … | +rights. | |
38 … | + | |
39 … | + We protect your rights with two steps: (1) copyright the software, and | |
40 … | +(2) offer you this license which gives you legal permission to copy, | |
41 … | +distribute and/or modify the software. | |
42 … | + | |
43 … | + Also, for each author's protection and ours, we want to make certain | |
44 … | +that everyone understands that there is no warranty for this free | |
45 … | +software. If the software is modified by someone else and passed on, we | |
46 … | +want its recipients to know that what they have is not the original, so | |
47 … | +that any problems introduced by others will not reflect on the original | |
48 … | +authors' reputations. | |
49 … | + | |
50 … | + Finally, any free program is threatened constantly by software | |
51 … | +patents. We wish to avoid the danger that redistributors of a free | |
52 … | +program will individually obtain patent licenses, in effect making the | |
53 … | +program proprietary. To prevent this, we have made it clear that any | |
54 … | +patent must be licensed for everyone's free use or not licensed at all. | |
55 … | + | |
56 … | + The precise terms and conditions for copying, distribution and | |
57 … | +modification follow. | |
58 … | + | |
59 … | + GNU GENERAL PUBLIC LICENSE | |
60 … | + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION | |
61 … | + | |
62 … | + 0. This License applies to any program or other work which contains | |
63 … | +a notice placed by the copyright holder saying it may be distributed | |
64 … | +under the terms of this General Public License. The "Program", below, | |
65 … | +refers to any such program or work, and a "work based on the Program" | |
66 … | +means either the Program or any derivative work under copyright law: | |
67 … | +that is to say, a work containing the Program or a portion of it, | |
68 … | +either verbatim or with modifications and/or translated into another | |
69 … | +language. (Hereinafter, translation is included without limitation in | |
70 … | +the term "modification".) Each licensee is addressed as "you". | |
71 … | + | |
72 … | +Activities other than copying, distribution and modification are not | |
73 … | +covered by this License; they are outside its scope. The act of | |
74 … | +running the Program is not restricted, and the output from the Program | |
75 … | +is covered only if its contents constitute a work based on the | |
76 … | +Program (independent of having been made by running the Program). | |
77 … | +Whether that is true depends on what the Program does. | |
78 … | + | |
79 … | + 1. You may copy and distribute verbatim copies of the Program's | |
80 … | +source code as you receive it, in any medium, provided that you | |
81 … | +conspicuously and appropriately publish on each copy an appropriate | |
82 … | +copyright notice and disclaimer of warranty; keep intact all the | |
83 … | +notices that refer to this License and to the absence of any warranty; | |
84 … | +and give any other recipients of the Program a copy of this License | |
85 … | +along with the Program. | |
86 … | + | |
87 … | +You may charge a fee for the physical act of transferring a copy, and | |
88 … | +you may at your option offer warranty protection in exchange for a fee. | |
89 … | + | |
90 … | + 2. You may modify your copy or copies of the Program or any portion | |
91 … | +of it, thus forming a work based on the Program, and copy and | |
92 … | +distribute such modifications or work under the terms of Section 1 | |
93 … | +above, provided that you also meet all of these conditions: | |
94 … | + | |
95 … | + a) You must cause the modified files to carry prominent notices | |
96 … | + stating that you changed the files and the date of any change. | |
97 … | + | |
98 … | + b) You must cause any work that you distribute or publish, that in | |
99 … | + whole or in part contains or is derived from the Program or any | |
100 … | + part thereof, to be licensed as a whole at no charge to all third | |
101 … | + parties under the terms of this License. | |
102 … | + | |
103 … | + c) If the modified program normally reads commands interactively | |
104 … | + when run, you must cause it, when started running for such | |
105 … | + interactive use in the most ordinary way, to print or display an | |
106 … | + announcement including an appropriate copyright notice and a | |
107 … | + notice that there is no warranty (or else, saying that you provide | |
108 … | + a warranty) and that users may redistribute the program under | |
109 … | + these conditions, and telling the user how to view a copy of this | |
110 … | + License. (Exception: if the Program itself is interactive but | |
111 … | + does not normally print such an announcement, your work based on | |
112 … | + the Program is not required to print an announcement.) | |
113 … | + | |
114 … | +These requirements apply to the modified work as a whole. If | |
115 … | +identifiable sections of that work are not derived from the Program, | |
116 … | +and can be reasonably considered independent and separate works in | |
117 … | +themselves, then this License, and its terms, do not apply to those | |
118 … | +sections when you distribute them as separate works. But when you | |
119 … | +distribute the same sections as part of a whole which is a work based | |
120 … | +on the Program, the distribution of the whole must be on the terms of | |
121 … | +this License, whose permissions for other licensees extend to the | |
122 … | +entire whole, and thus to each and every part regardless of who wrote it. | |
123 … | + | |
124 … | +Thus, it is not the intent of this section to claim rights or contest | |
125 … | +your rights to work written entirely by you; rather, the intent is to | |
126 … | +exercise the right to control the distribution of derivative or | |
127 … | +collective works based on the Program. | |
128 … | + | |
129 … | +In addition, mere aggregation of another work not based on the Program | |
130 … | +with the Program (or with a work based on the Program) on a volume of | |
131 … | +a storage or distribution medium does not bring the other work under | |
132 … | +the scope of this License. | |
133 … | + | |
134 … | + 3. You may copy and distribute the Program (or a work based on it, | |
135 … | +under Section 2) in object code or executable form under the terms of | |
136 … | +Sections 1 and 2 above provided that you also do one of the following: | |
137 … | + | |
138 … | + a) Accompany it with the complete corresponding machine-readable | |
139 … | + source code, which must be distributed under the terms of Sections | |
140 … | + 1 and 2 above on a medium customarily used for software interchange; or, | |
141 … | + | |
142 … | + b) Accompany it with a written offer, valid for at least three | |
143 … | + years, to give any third party, for a charge no more than your | |
144 … | + cost of physically performing source distribution, a complete | |
145 … | + machine-readable copy of the corresponding source code, to be | |
146 … | + distributed under the terms of Sections 1 and 2 above on a medium | |
147 … | + customarily used for software interchange; or, | |
148 … | + | |
149 … | + c) Accompany it with the information you received as to the offer | |
150 … | + to distribute corresponding source code. (This alternative is | |
151 … | + allowed only for noncommercial distribution and only if you | |
152 … | + received the program in object code or executable form with such | |
153 … | + an offer, in accord with Subsection b above.) | |
154 … | + | |
155 … | +The source code for a work means the preferred form of the work for | |
156 … | +making modifications to it. For an executable work, complete source | |
157 … | +code means all the source code for all modules it contains, plus any | |
158 … | +associated interface definition files, plus the scripts used to | |
159 … | +control compilation and installation of the executable. However, as a | |
160 … | +special exception, the source code distributed need not include | |
161 … | +anything that is normally distributed (in either source or binary | |
162 … | +form) with the major components (compiler, kernel, and so on) of the | |
163 … | +operating system on which the executable runs, unless that component | |
164 … | +itself accompanies the executable. | |
165 … | + | |
166 … | +If distribution of executable or object code is made by offering | |
167 … | +access to copy from a designated place, then offering equivalent | |
168 … | +access to copy the source code from the same place counts as | |
169 … | +distribution of the source code, even though third parties are not | |
170 … | +compelled to copy the source along with the object code. | |
171 … | + | |
172 … | + 4. You may not copy, modify, sublicense, or distribute the Program | |
173 … | +except as expressly provided under this License. Any attempt | |
174 … | +otherwise to copy, modify, sublicense or distribute the Program is | |
175 … | +void, and will automatically terminate your rights under this License. | |
176 … | +However, parties who have received copies, or rights, from you under | |
177 … | +this License will not have their licenses terminated so long as such | |
178 … | +parties remain in full compliance. | |
179 … | + | |
180 … | + 5. You are not required to accept this License, since you have not | |
181 … | +signed it. However, nothing else grants you permission to modify or | |
182 … | +distribute the Program or its derivative works. These actions are | |
183 … | +prohibited by law if you do not accept this License. Therefore, by | |
184 … | +modifying or distributing the Program (or any work based on the | |
185 … | +Program), you indicate your acceptance of this License to do so, and | |
186 … | +all its terms and conditions for copying, distributing or modifying | |
187 … | +the Program or works based on it. | |
188 … | + | |
189 … | + 6. Each time you redistribute the Program (or any work based on the | |
190 … | +Program), the recipient automatically receives a license from the | |
191 … | +original licensor to copy, distribute or modify the Program subject to | |
192 … | +these terms and conditions. You may not impose any further | |
193 … | +restrictions on the recipients' exercise of the rights granted herein. | |
194 … | +You are not responsible for enforcing compliance by third parties to | |
195 … | +this License. | |
196 … | + | |
197 … | + 7. If, as a consequence of a court judgment or allegation of patent | |
198 … | +infringement or for any other reason (not limited to patent issues), | |
199 … | +conditions are imposed on you (whether by court order, agreement or | |
200 … | +otherwise) that contradict the conditions of this License, they do not | |
201 … | +excuse you from the conditions of this License. If you cannot | |
202 … | +distribute so as to satisfy simultaneously your obligations under this | |
203 … | +License and any other pertinent obligations, then as a consequence you | |
204 … | +may not distribute the Program at all. For example, if a patent | |
205 … | +license would not permit royalty-free redistribution of the Program by | |
206 … | +all those who receive copies directly or indirectly through you, then | |
207 … | +the only way you could satisfy both it and this License would be to | |
208 … | +refrain entirely from distribution of the Program. | |
209 … | + | |
210 … | +If any portion of this section is held invalid or unenforceable under | |
211 … | +any particular circumstance, the balance of the section is intended to | |
212 … | +apply and the section as a whole is intended to apply in other | |
213 … | +circumstances. | |
214 … | + | |
215 … | +It is not the purpose of this section to induce you to infringe any | |
216 … | +patents or other property right claims or to contest validity of any | |
217 … | +such claims; this section has the sole purpose of protecting the | |
218 … | +integrity of the free software distribution system, which is | |
219 … | +implemented by public license practices. Many people have made | |
220 … | +generous contributions to the wide range of software distributed | |
221 … | +through that system in reliance on consistent application of that | |
222 … | +system; it is up to the author/donor to decide if he or she is willing | |
223 … | +to distribute software through any other system and a licensee cannot | |
224 … | +impose that choice. | |
225 … | + | |
226 … | +This section is intended to make thoroughly clear what is believed to | |
227 … | +be a consequence of the rest of this License. | |
228 … | + | |
229 … | + 8. If the distribution and/or use of the Program is restricted in | |
230 … | +certain countries either by patents or by copyrighted interfaces, the | |
231 … | +original copyright holder who places the Program under this License | |
232 … | +may add an explicit geographical distribution limitation excluding | |
233 … | +those countries, so that distribution is permitted only in or among | |
234 … | +countries not thus excluded. In such case, this License incorporates | |
235 … | +the limitation as if written in the body of this License. | |
236 … | + | |
237 … | + 9. The Free Software Foundation may publish revised and/or new versions | |
238 … | +of the General Public License from time to time. Such new versions will | |
239 … | +be similar in spirit to the present version, but may differ in detail to | |
240 … | +address new problems or concerns. | |
241 … | + | |
242 … | +Each version is given a distinguishing version number. If the Program | |
243 … | +specifies a version number of this License which applies to it and "any | |
244 … | +later version", you have the option of following the terms and conditions | |
245 … | +either of that version or of any later version published by the Free | |
246 … | +Software Foundation. If the Program does not specify a version number of | |
247 … | +this License, you may choose any version ever published by the Free Software | |
248 … | +Foundation. | |
249 … | + | |
250 … | + 10. If you wish to incorporate parts of the Program into other free | |
251 … | +programs whose distribution conditions are different, write to the author | |
252 … | +to ask for permission. For software which is copyrighted by the Free | |
253 … | +Software Foundation, write to the Free Software Foundation; we sometimes | |
254 … | +make exceptions for this. Our decision will be guided by the two goals | |
255 … | +of preserving the free status of all derivatives of our free software and | |
256 … | +of promoting the sharing and reuse of software generally. | |
257 … | + | |
258 … | + NO WARRANTY | |
259 … | + | |
260 … | + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY | |
261 … | +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN | |
262 … | +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES | |
263 … | +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED | |
264 … | +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
265 … | +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS | |
266 … | +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE | |
267 … | +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, | |
268 … | +REPAIR OR CORRECTION. | |
269 … | + | |
270 … | + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING | |
271 … | +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR | |
272 … | +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, | |
273 … | +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING | |
274 … | +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED | |
275 … | +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY | |
276 … | +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER | |
277 … | +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE | |
278 … | +POSSIBILITY OF SUCH DAMAGES. | |
279 … | + | |
280 … | + END OF TERMS AND CONDITIONS | |
281 … | + | |
282 … | + How to Apply These Terms to Your New Programs | |
283 … | + | |
284 … | + If you develop a new program, and you want it to be of the greatest | |
285 … | +possible use to the public, the best way to achieve this is to make it | |
286 … | +free software which everyone can redistribute and change under these terms. | |
287 … | + | |
288 … | + To do so, attach the following notices to the program. It is safest | |
289 … | +to attach them to the start of each source file to most effectively | |
290 … | +convey the exclusion of warranty; and each file should have at least | |
291 … | +the "copyright" line and a pointer to where the full notice is found. | |
292 … | + | |
293 … | + <one line to give the program's name and a brief idea of what it does.> | |
294 … | + Copyright (C) <year> <name of author> | |
295 … | + | |
296 … | + This program is free software; you can redistribute it and/or modify | |
297 … | + it under the terms of the GNU General Public License as published by | |
298 … | + the Free Software Foundation; either version 2 of the License, or | |
299 … | + (at your option) any later version. | |
300 … | + | |
301 … | + This program is distributed in the hope that it will be useful, | |
302 … | + but WITHOUT ANY WARRANTY; without even the implied warranty of | |
303 … | + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
304 … | + GNU General Public License for more details. | |
305 … | + | |
306 … | + You should have received a copy of the GNU General Public License | |
307 … | + along with this program; if not, write to the Free Software | |
308 … | + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
309 … | + | |
310 … | + | |
311 … | +Also add information on how to contact you by electronic and paper mail. | |
312 … | + | |
313 … | +If the program is interactive, make it output a short notice like this | |
314 … | +when it starts in an interactive mode: | |
315 … | + | |
316 … | + Gnomovision version 69, Copyright (C) year name of author | |
317 … | + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. | |
318 … | + This is free software, and you are welcome to redistribute it | |
319 … | + under certain conditions; type `show c' for details. | |
320 … | + | |
321 … | +The hypothetical commands `show w' and `show c' should show the appropriate | |
322 … | +parts of the General Public License. Of course, the commands you use may | |
323 … | +be called something other than `show w' and `show c'; they could even be | |
324 … | +mouse-clicks or menu items--whatever suits your program. | |
325 … | + | |
326 … | +You should also get your employer (if you work as a programmer) or your | |
327 … | +school, if any, to sign a "copyright disclaimer" for the program, if | |
328 … | +necessary. Here is a sample; alter the names: | |
329 … | + | |
330 … | + Yoyodyne, Inc., hereby disclaims all copyright interest in the program | |
331 … | + `Gnomovision' (which makes passes at compilers) written by James Hacker. | |
332 … | + | |
333 … | + <signature of Ty Coon>, 1 April 1989 | |
334 … | + Ty Coon, President of Vice | |
335 … | + | |
336 … | +This General Public License does not permit incorporating your program into | |
337 … | +proprietary programs. If your program is a subroutine library, you may | |
338 … | +consider it more useful to permit linking proprietary applications with the | |
339 … | +library. If this is what you want to do, use the GNU Library General | |
340 … | +Public License instead of this License. |
README | ||
---|---|---|
@@ -1,0 +1,68 @@ | ||
1 … | +FreeCheck v0.1 July 16, 2000 | |
2 … | +Eric Sandeen, <eric_sandeen@bigfoot.com> | |
3 … | + | |
4 … | +WHY? | |
5 … | +--- | |
6 … | +MIPS/VersaCheck ticked me off with their (IMHO) shoddy check-printing | |
7 … | +application, and their dismal customer service. So here you go. | |
8 … | + | |
9 … | +REQUIREMENTS | |
10 … | +------------ | |
11 … | +The first thing that you MUST have to be able to use FreeCheck is a | |
12 … | +good Type 1 MICR font. I have created one, called "GnuMICR" that I think | |
13 … | +is pretty excellent - but it has not been tested. :) There are also | |
14 … | +commercial fonts you can buy, if that floats your boat. See | |
15 … | +www.bizfonts.com, for example. | |
16 … | + | |
17 … | +You must also have either a PostScript printer, or a recent version | |
18 … | +of GhostScript. FreeCheck generates the check as a PostScript file. | |
19 … | + | |
20 … | +CONFIGURATION | |
21 … | +------------- | |
22 … | +Edit the file freecheck.cfg to add your account information, and define | |
23 … | +any new check blanks or styles you want. Take a look at the [Global] | |
24 … | +section, too, to set things up for your system. | |
25 … | + | |
26 … | +USAGE | |
27 … | +----- | |
28 … | +FreeCheck just prints a PostScript file to STDOUT. That means that you | |
29 … | +must either redirect it to a file, a printer, or a viewer (ggv accepts | |
30 … | +a file on STDIN - I don't think gv does). | |
31 … | + | |
32 … | +So, to print (assuming a PostScript printer, or GhostView filter): | |
33 … | +freecheck.pl <options> | lpr | |
34 … | + | |
35 … | +To view: | |
36 … | +freecheck.pl <options> | ggv | |
37 … | + | |
38 … | +To save a file: | |
39 … | +freecheck.pl <options> > mycheckfile.ps | |
40 … | + | |
41 … | +OPTIONS | |
42 … | +------- | |
43 … | +freecheck doesn't require any options, unless you want it to do something | |
44 … | +useful. By itself, it will print a couple sheets of standard checks | |
45 … | +with a dummy account. | |
46 … | + | |
47 … | +Type "freecheck --help" to see what options are available | |
48 … | + | |
49 … | +For now, if you get tired of typing all those command line options, just | |
50 … | +edit the defaults at the top of the main script. | |
51 … | + | |
52 … | +HOW DOES IT WORK? | |
53 … | +----------------- | |
54 … | +FreeCheck is a Frankenstein-like combination of PostScript and Perl, | |
55 … | +at this point. The guts of the check layout are in PostScript, which | |
56 … | +is embedded at the end of the Perl script. This PostScript depends on | |
57 … | +lots of variable definitions to decide what it should actually print. | |
58 … | +That's where the Perl comes in - reading a config file, and generating | |
59 … | +lots of lines of the type | |
60 … | + /foo {bar} def | |
61 … | +which define what's shown on the page. | |
62 … | + | |
63 … | +The file "example_check.ps" is a fairly well commented example of the | |
64 … | +PostScript that is output by freecheck. If you want to add something | |
65 … | +to the layout, it may be easier to work with that file, get it going, | |
66 … | +and then add the changes to the perl script. And send them to me, | |
67 … | +of course! :-) | |
68 … | + |
TODO | ||
---|---|---|
@@ -1,0 +1,20 @@ | ||
1 … | +Things to do, in no particular order: | |
2 … | + | |
3 … | + * Implement some sort of bank logo inclusion (.eps file) | |
4 … | + * Fix all the regexp problems that are surely in there | |
5 … | + * Allow for a global config file, and a personal config file | |
6 … | + * Write a CGI version, or include it in the same file | |
7 … | + * Allow some defaults to be set in the config file to shorten command line | |
8 … | + * Tweak PostScript to make sure nothing falls in the "forbidden" MICR area | |
9 … | + * Print receipts or whatever on check blanks that allow space for that | |
10 … | + * Command-line options for payee, date, memo, and amount | |
11 … | + (Print out entire, filled out check, not just empty) | |
12 … | + * Write a GUI around this thing | |
13 … | + * Get more check blank definitions | |
14 … | + * Pass MICR tweaks on command line (?) | |
15 … | + * Include a --print option on command line? | |
16 … | + * Include a --pdf option on command line? (generate PDF, not PS) | |
17 … | + * Add Document Structuring Convention stuff to the PS file | |
18 … | + | |
19 … | +And finally... | |
20 … | + * Get brave enough to see if one of these puppies actually clears the bank! |
example_check.ps | ||
---|---|---|
@@ -1,0 +1,524 @@ | ||
1 … | +%! | |
2 … | +%--------------- | |
3 … | +% | |
4 … | +% FreeCheck - a free check printing application released | |
5 … | +% under the GNU General Public Licene. | |
6 … | +% | |
7 … | +% Copyright (C) 2000 Eric Sandeen (eric_sandeen@bigfoot.com) | |
8 … | +% | |
9 … | +% This program is free software; you can redistribute it and/or modify | |
10 … | +% it under the terms of the GNU General Public License as published by | |
11 … | +% the Free Software Foundation; either version 2 of the License, or | |
12 … | +% (at your option) any later version. | |
13 … | +% | |
14 … | +% This program is distributed in the hope that it will be useful, | |
15 … | +% but WITHOUT ANY WARRANTY; without even the implied warranty of | |
16 … | +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
17 … | +% GNU General Public License for more details. | |
18 … | +% | |
19 … | +% You should have received a copy of the GNU General Public License | |
20 … | +% along with this program; if not, write to the Free Software | |
21 … | +% Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | |
22 … | +% | |
23 … | +%--------------- | |
24 … | + | |
25 … | +% Let's get this out of the way first: | |
26 … | +/inch {72 mul} def | |
27 … | + | |
28 … | +%%%%%%%%%%%%%%%%%%%%% | |
29 … | +% Account info % | |
30 … | +% Text on the check % | |
31 … | +% (The Account File)% | |
32 … | +%%%%%%%%%%%%%%%%%%%%% | |
33 … | + | |
34 … | + | |
35 … | +% Things to define at each printing | |
36 … | +% --------------------------------- | |
37 … | +% --------------------------------- | |
38 … | + | |
39 … | +% Check number | |
40 … | +% ------------ | |
41 … | +% Check number for first check on the page | |
42 … | + | |
43 … | +/CheckNumber 100 def | |
44 … | + | |
45 … | +% Parts to print | |
46 … | +% -------------- | |
47 … | +% What exactly do we want to print? This is so that people can use | |
48 … | +% special MICR toner if they want, and print two-pass | |
49 … | + | |
50 … | +/PrintCheckBody true def | |
51 … | +/PrintMICRLine true def | |
52 … | + | |
53 … | +% Number of pages to print | |
54 … | +/NumPages 3 def | |
55 … | + | |
56 … | +% Prints a big VOID over the check | |
57 … | +/PrintVOID false def | |
58 … | + | |
59 … | +% Basic account information | |
60 … | +% ------------------------- | |
61 … | +% ------------------------- | |
62 … | + | |
63 … | +% Account Holder's Name, etc | |
64 … | +% -------------------------- | |
65 … | +% If Name2 or Address2 are empty, they will not be printed | |
66 … | + | |
67 … | +/Name1 (JOHN SMITH) def | |
68 … | +/Name2 (MARY SMITH) def | |
69 … | +/Address1 (1234 Main Street) def | |
70 … | +/Address2 () def | |
71 … | +/CityStateZip (Anytown, USA 12345) def | |
72 … | +/PhoneNumber (512-555-1212) def | |
73 … | + | |
74 … | +% Bank information | |
75 … | +% ---------------- | |
76 … | +% If BankAddr2 is empty, it will not be printed | |
77 … | + | |
78 … | +/BankName (GlobalMegaCorp, NA) def | |
79 … | +/BankAddr1 (123 Main Street) def | |
80 … | +/BankAddr2 (PO Box 45) def | |
81 … | +/BankCityStateZip (Anytown, USA 12345) def | |
82 … | + | |
83 … | +% Account Information | |
84 … | +% ------------------- | |
85 … | + | |
86 … | +/RoutingNumber (012345678) def % Leftmost MICR numbers | |
87 … | +/AccountNumber (1234567890) def % Middle MICR numbers | |
88 … | +/Fraction (12345/67890) def % Fraction at top of check | |
89 … | + | |
90 … | +% MICR Line placement "Tweaking" | |
91 … | +%------------------------------- | |
92 … | +% We add the MICR tweaking here (rather than in the check | |
93 … | +% blank definition) because it's likely the user will | |
94 … | +% need to change this. The blank definition may not be | |
95 … | +% writeable by the user | |
96 … | + | |
97 … | +/MICRVerTweak {0} def | |
98 … | +/MICRHorTweak {0} def | |
99 … | + | |
100 … | +%%%%%%%%%%%%%%%%%%%%%%%%% | |
101 … | +% Check Style % | |
102 … | +% Fonts and Layout Info % | |
103 … | +% (The Style File) % | |
104 … | +%%%%%%%%%%%%%%%%%%%%%%%%% | |
105 … | + | |
106 … | +% Font Names & Sizes | |
107 … | +% ------------------ | |
108 … | +% The StandardFontSize is just the basic size for non-MICR | |
109 … | +% text. Things get scaled a bit from there (Names are larger than | |
110 … | +% addresses, etc) | |
111 … | + | |
112 … | +/StandardFontName /AvantGarde-Book def | |
113 … | +/StandardFontSize 9 def | |
114 … | + | |
115 … | +% This is NOT THE MICR FONT! It is the check number on top right | |
116 … | +/CheckNumFont /Helvetica-Bold def | |
117 … | +/CheckNumSize 14 def | |
118 … | + | |
119 … | +% Margins, etc, within the check itself | |
120 … | +% ------------------------------------- | |
121 … | + | |
122 … | +/LeftMargin {0.2 inch} def | |
123 … | +/RightMargin {0.4 inch} def | |
124 … | +/TopMargin {0.2 inch} def | |
125 … | + | |
126 … | +% Check feature placement | |
127 … | +% ----------------------- | |
128 … | +% (relative to bottom left corner of check) | |
129 … | + | |
130 … | +/MemoLineHeight {0.25 CheckHeight mul} def | |
131 … | +/SignatureLineHeight {0.25 CheckHeight mul} def | |
132 … | +/AmountLineHeight {0.50 CheckHeight mul} def | |
133 … | +/PayeeLineHeight {0.60 CheckHeight mul} def | |
134 … | +/BankInfoHeight {0.45 CheckHeight mul} def | |
135 … | +/DateLineHeight {0.75 CheckHeight mul} def | |
136 … | + | |
137 … | +%%%%%%%%%%%%%%%%%%%%%%%%%% | |
138 … | +% Check Blank Dimensions % | |
139 … | +% (The Check Blank File) % | |
140 … | +%%%%%%%%%%%%%%%%%%%%%%%%%% | |
141 … | + | |
142 … | +% Information about how the checks are laid out on the page | |
143 … | +% --------------------------------------------------------- | |
144 … | + | |
145 … | +/CheckHeight {2.85 inch} def | |
146 … | +/CheckWidth {5.96 inch} def | |
147 … | +/CheckHorOffset {2.54 inch} def % how far are checks from left edge of sheet | |
148 … | +/CheckVerOffset {2.48 inch} def % how far is bottom check from bottom of sheet | |
149 … | +/ChecksPerPage {3} def % How many checks are on the sheet? (vertical) | |
150 … | + | |
151 … | +%%%%%%%%%%%%%%%%%%%%%%% | |
152 … | +% Global Setup Values % | |
153 … | +%%%%%%%%%%%%%%%%%%%%%%% | |
154 … | + | |
155 … | +% MICR Font | |
156 … | +% --------- | |
157 … | +% For the MICR font, SIZE MATTERS! Make sure you have the right point | |
158 … | +% size for the particular MICR font you're using. Most (including | |
159 … | +% GnuMICR) are correct at 12 pts, but READ THE DOCS THAT CAME WITH | |
160 … | +% THE FONT! :) | |
161 … | + | |
162 … | +/MICRFontName /GnuMICR def | |
163 … | +/MICRFontSize 12 def | |
164 … | + | |
165 … | +% MICR Symbol Mapping | |
166 … | +% ------------------- | |
167 … | +% Maps which characters show which MICR symbols in the font you're using | |
168 … | +% Approximate representations of these symbols, with names, below: | |
169 … | +% |: = TransitNumberSymbol | |
170 … | +% / = Amount | |
171 … | +% P = OnUs | |
172 … | +% - = Dash | |
173 … | + | |
174 … | +/TransitSymbol (A) def | |
175 … | +/OnUsSymbol (C) def | |
176 … | +/AmountSymbol (B) def | |
177 … | +/DashSymbol (D) def | |
178 … | + | |
179 … | +% MICR Line placement | |
180 … | +% ------------------- | |
181 … | +% This should be smack in the middle of the tolerance band... | |
182 … | +% Tweaks are accomplished by the user in the Global section | |
183 … | + | |
184 … | +/MICRLineHeight {0.25 inch} def | |
185 … | + | |
186 … | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
187 … | +% End of user entered information % | |
188 … | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
189 … | + | |
190 … | +% Other Constants: | |
191 … | + | |
192 … | +% Size of the rectangular box for the amount (digits) | |
193 … | +/AmountBoxWidth {1 inch} def | |
194 … | +/AmountBoxHeight {0.25 inch} def | |
195 … | + | |
196 … | +/LineWidth {0.3} def | |
197 … | + | |
198 … | +% Max number of digits in check number, and allocate string | |
199 … | +/CheckNumDigits 4 def | |
200 … | +/CheckNumberString CheckNumDigits string def | |
201 … | + | |
202 … | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
203 … | +% Helpful Printing Routines % | |
204 … | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
205 … | + | |
206 … | +% Shows a line, then does a "carriage return / line feed" | |
207 … | +% But only if the string exists (more than 0 chars) | |
208 … | +% (How do we get the current font size (height)?) | |
209 … | + | |
210 … | +/ShowAndCR { | |
211 … | + % A couple copies of the string (now 3 on stack) | |
212 … | + dup dup | |
213 … | + length 0 gt { % First copy | |
214 … | + show % Second copy | |
215 … | + stringwidth pop neg 0 rmoveto % Third copy & move back | |
216 … | + neg 0 exch rmoveto % line down | |
217 … | + } if | |
218 … | +} def | |
219 … | + | |
220 … | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
221 … | +% Feature Printing Routines % | |
222 … | +%%%%%%%%%%%%%%%%%%%%%%%%%%%%% | |
223 … | + | |
224 … | +/DrawMemoLine { | |
225 … | + LeftMargin MemoLineHeight moveto | |
226 … | + 2.5 inch 0 inch rlineto | |
227 … | + -2.5 inch 0 inch rmoveto | |
228 … | + 0 2 rmoveto | |
229 … | + (for) show | |
230 … | +} def | |
231 … | + | |
232 … | +/DrawSignatureLine { % Expects height of signature line | |
233 … | + % and right edge of check for | |
234 … | + % beginning position | |
235 … | + | |
236 … | + CheckWidth SignatureLineHeight moveto | |
237 … | + RightMargin neg 0 rmoveto | |
238 … | + -2.5 inch 0 rmoveto | |
239 … | + 2.5 inch 0 inch rlineto | |
240 … | + | |
241 … | +} def | |
242 … | + | |
243 … | +/DrawAmountLine { | |
244 … | + CheckWidth AmountLineHeight moveto | |
245 … | + RightMargin neg 0 rmoveto | |
246 … | + (DOLLARS) stringwidth pop neg 0 rmoveto | |
247 … | + (DOLLARS) show | |
248 … | + (DOLLARS) stringwidth pop neg 0 rmoveto | |
249 … | + -2 0 rmoveto | |
250 … | + LeftMargin AmountLineHeight lineto | |
251 … | +} def | |
252 … | + | |
253 … | +/DrawAccountHolderInfo { | |
254 … | + LeftMargin CheckHeight moveto | |
255 … | + 0 TopMargin neg rmoveto | |
256 … | + 0 StandardFontSize neg rmoveto | |
257 … | + | |
258 … | + | |
259 … | + StandardFontSize Name1 ShowAndCR | |
260 … | + %Name1 show | |
261 … | + %Name1 stringwidth pop neg StandardFontSize neg rmoveto | |
262 … | + | |
263 … | + | |
264 … | + StandardFontSize Name2 ShowAndCR | |
265 … | + % Show Name2 only if present | |
266 … | + %Name2 length 0 gt { | |
267 … | + % Name2 show | |
268 … | + % Name2 stringwidth pop neg StandardFontSize neg rmoveto | |
269 … | + %} if | |
270 … | + | |
271 … | + StandardFontName findfont | |
272 … | + StandardFontSize 1 sub scalefont | |
273 … | + setfont | |
274 … | + | |
275 … | + StandardFontSize 1 sub Address1 ShowAndCR | |
276 … | + %Address1 stringwidth pop neg StandardFontSize neg rmoveto | |
277 … | + | |
278 … | + % Show Address2 only if present | |
279 … | + Address2 length 0 gt { | |
280 … | + Address2 show | |
281 … | + Address2 stringwidth pop neg StandardFontSize neg rmoveto | |
282 … | + } if | |
283 … | + | |
284 … | + CityStateZip show | |
285 … | + CityStateZip stringwidth pop neg StandardFontSize neg rmoveto | |
286 … | + | |
287 … | + % Show PhoneNumber only if present | |
288 … | + PhoneNumber length 0 gt { | |
289 … | + PhoneNumber show | |
290 … | + PhoneNumber stringwidth pop neg StandardFontSize neg rmoveto | |
291 … | + } if | |
292 … | + | |
293 … | + StandardFontName findfont | |
294 … | + StandardFontSize 1 add scalefont | |
295 … | + setfont | |
296 … | +} def | |
297 … | + | |
298 … | +/DrawDateLine { | |
299 … | + 0.6 CheckWidth mul DateLineHeight moveto | |
300 … | + (Date) show | |
301 … | + 1 inch 0 rlineto | |
302 … | +} def | |
303 … | + | |
304 … | +/DrawBankInfo { | |
305 … | + LeftMargin BankInfoHeight moveto | |
306 … | + | |
307 … | + BankName show | |
308 … | + BankName stringwidth pop neg StandardFontSize neg rmoveto | |
309 … | + | |
310 … | + StandardFontName findfont | |
311 … | + StandardFontSize 1 sub scalefont | |
312 … | + setfont | |
313 … | + | |
314 … | + BankAddr1 show | |
315 … | + BankAddr1 stringwidth pop neg StandardFontSize neg rmoveto | |
316 … | + | |
317 … | + % Show Addr2 only if present | |
318 … | + BankAddr2 length 0 gt { | |
319 … | + BankAddr2 show | |
320 … | + BankAddr2 stringwidth pop neg StandardFontSize neg rmoveto | |
321 … | + } if | |
322 … | + | |
323 … | + BankCityStateZip show | |
324 … | + BankCityStateZip stringwidth pop neg StandardFontSize neg rmoveto | |
325 … | + | |
326 … | + StandardFontName findfont | |
327 … | + StandardFontSize 1 add scalefont | |
328 … | + setfont | |
329 … | +} def | |
330 … | + | |
331 … | +/DrawPayeeLine { | |
332 … | + | |
333 … | + LeftMargin PayeeLineHeight moveto | |
334 … | + (ORDER OF) show | |
335 … | + (ORDER OF) stringwidth pop neg StandardFontSize rmoveto | |
336 … | + (PAY TO THE) show | |
337 … | + 0 StandardFontSize neg rmoveto | |
338 … | + 4 0 rmoveto | |
339 … | + currentpoint mark | |
340 … | + | |
341 … | + CheckWidth PayeeLineHeight moveto | |
342 … | + RightMargin neg 0 rmoveto | |
343 … | + AmountBoxWidth neg 0 rmoveto | |
344 … | + | |
345 … | + 0 AmountBoxHeight rlineto | |
346 … | + AmountBoxWidth 0 rlineto | |
347 … | + 0 AmountBoxHeight neg rlineto | |
348 … | + AmountBoxWidth neg 0 rlineto | |
349 … | + | |
350 … | + -4 0 rmoveto | |
351 … | + | |
352 … | + /Helvetica-Bold findfont | |
353 … | + 14 scalefont | |
354 … | + setfont | |
355 … | + | |
356 … | + ($) stringwidth pop neg 0 rmoveto | |
357 … | + ($) show | |
358 … | + ($) stringwidth pop neg 0 rmoveto | |
359 … | + | |
360 … | + -4 0 rmoveto | |
361 … | + cleartomark | |
362 … | + lineto | |
363 … | + | |
364 … | + StandardFontName findfont | |
365 … | + StandardFontSize scalefont | |
366 … | + setfont | |
367 … | + | |
368 … | +} def | |
369 … | + | |
370 … | +/DrawMICR { | |
371 … | + % 0.25 high, 5.6875 from right edge should be in the middle | |
372 … | + % of the tolerance band | |
373 … | + CheckWidth 0.25 inch moveto | |
374 … | + -5.6875 inch 0 inch rmoveto | |
375 … | + MICRHorTweak MICRVerTweak rmoveto | |
376 … | + | |
377 … | + save | |
378 … | + MICRFontName findfont | |
379 … | + MICRFontSize scalefont | |
380 … | + setfont | |
381 … | + TransitSymbol show | |
382 … | + RoutingNumber show | |
383 … | + TransitSymbol show | |
384 … | + ( ) show | |
385 … | + % Pad with spaces if acct number is short | |
386 … | + 12 AccountNumber length sub {( ) show} repeat | |
387 … | + AccountNumber show | |
388 … | + OnUsSymbol show | |
389 … | + ( ) show | |
390 … | + % Same deal, pad w/ 0s if short check number | |
391 … | + CheckNumDigits 1 sub -1 1 | |
392 … | + {CheckNumberString exch get 0 eq {(0) show} if } for | |
393 … | + CheckNumberString show | |
394 … | + restore | |
395 … | +} def | |
396 … | + | |
397 … | +/DrawCheckNumber { | |
398 … | + CheckWidth CheckHeight moveto | |
399 … | + RightMargin neg TopMargin neg rmoveto | |
400 … | + CheckNumFont findfont | |
401 … | + CheckNumSize scalefont | |
402 … | + setfont | |
403 … | + | |
404 … | + CheckNumberString stringwidth pop neg 0 rmoveto | |
405 … | + 0 -14 rmoveto | |
406 … | + CheckNumberString show | |
407 … | + | |
408 … | + StandardFontName findfont | |
409 … | + StandardFontSize scalefont | |
410 … | + setfont | |
411 … | +} def | |
412 … | + | |
413 … | +/DrawFraction { | |
414 … | + 0.6 CheckWidth mul CheckHeight moveto | |
415 … | + 0 TopMargin neg rmoveto | |
416 … | + 0 StandardFontSize neg rmoveto | |
417 … | + Fraction show | |
418 … | +} def | |
419 … | + | |
420 … | +/DrawStub { | |
421 … | + CheckHorOffset 2 inch ge { | |
422 … | + save | |
423 … | + newpath | |
424 … | + CheckHorOffset neg 0 translate | |
425 … | + StandardFontName findfont | |
426 … | + StandardFontSize 1 sub scalefont | |
427 … | + setfont | |
428 … | + /StubSpacing {CheckHeight 6 div} def | |
429 … | + CheckHorOffset 2 div StubSpacing 5 mul moveto | |
430 … | + CheckNumberString show | |
431 … | + 0.3 inch StubSpacing 4 mul moveto | |
432 … | + (Date ) show | |
433 … | + CheckHorOffset 0.3 inch sub StubSpacing 4 mul lineto | |
434 … | + 0.3 inch StubSpacing 3 mul moveto | |
435 … | + (Payee ) show | |
436 … | + CheckHorOffset 0.3 inch sub StubSpacing 3 mul lineto | |
437 … | + 0.3 inch StubSpacing 2 mul moveto | |
438 … | + (Amount ) show | |
439 … | + CheckHorOffset 0.3 inch sub StubSpacing 2 mul lineto | |
440 … | + 0.3 inch StubSpacing 1 mul moveto | |
441 … | + (Memo ) show | |
442 … | + CheckHorOffset 0.3 inch sub StubSpacing 1 mul lineto | |
443 … | + stroke | |
444 … | + restore | |
445 … | + } if | |
446 … | +} def | |
447 … | + | |
448 … | +/DrawVOID { | |
449 … | + save | |
450 … | + StandardFontName findfont | |
451 … | + 50 scalefont | |
452 … | + setfont | |
453 … | + newpath | |
454 … | + CheckWidth 2 div 1 inch moveto | |
455 … | + 30 rotate | |
456 … | + (V O I D) stringwidth pop 0 moveto | |
457 … | + (V O I D) true charpath | |
458 … | + stroke | |
459 … | + restore | |
460 … | +} def | |
461 … | + | |
462 … | +/DrawCheck { | |
463 … | + % Temporarily draw boxes around the checks | |
464 … | + 0 0 moveto | |
465 … | + CheckWidth 0 lineto | |
466 … | + CheckWidth CheckHeight lineto | |
467 … | + 0 CheckHeight lineto | |
468 … | + 0 0 lineto | |
469 … | + | |
470 … | + % Convert CheckNumber integer to a string | |
471 … | + PrintCheckBody { | |
472 … | + CheckNumber CheckNumberString cvs | |
473 … | + DrawBankInfo | |
474 … | + DrawAccountHolderInfo | |
475 … | + DrawMemoLine | |
476 … | + DrawSignatureLine | |
477 … | + DrawAmountLine | |
478 … | + DrawPayeeLine | |
479 … | + DrawCheckNumber | |
480 … | + DrawFraction | |
481 … | + DrawDateLine | |
482 … | + } if | |
483 … | + | |
484 … | + PrintMICRLine { | |
485 … | + DrawMICR | |
486 … | + } if | |
487 … | + | |
488 … | + PrintVOID { | |
489 … | + DrawVOID | |
490 … | + } if | |
491 … | + | |
492 … | +} def | |
493 … | + | |
494 … | + | |
495 … | +/CurrentPage 1 def | |
496 … | + | |
497 … | +NumPages -1 1 { | |
498 … | + /CheckNumber CheckNumber ChecksPerPage add def | |
499 … | + CheckHorOffset CheckVerOffset translate | |
500 … | + | |
501 … | + StandardFontName findfont | |
502 … | + StandardFontSize scalefont | |
503 … | + setfont | |
504 … | + | |
505 … | + LineWidth setlinewidth | |
506 … | + | |
507 … | + % Loop through printing checks, starting with the bottom one | |
508 … | + | |
509 … | + ChecksPerPage -1 1 { | |
510 … | + /CheckNumber CheckNumber 1 sub def | |
511 … | + newpath | |
512 … | + | |
513 … | + DrawCheck | |
514 … | + DrawStub % But only if there is room | |
515 … | + | |
516 … | + stroke | |
517 … | + 0 CheckHeight translate | |
518 … | + } for | |
519 … | + | |
520 … | + showpage | |
521 … | + /CheckNumber CheckNumber ChecksPerPage add def | |
522 … | + /CurrentPage CurrentPage 1 add def | |
523 … | + | |
524 … | +} for |
freecheck.cfg | ||
---|---|---|
@@ -1,0 +1,246 @@ | ||
1 … | +# Freecheck Configuration File | |
2 … | + | |
3 … | +# Format: | |
4 … | +# Sections of the format: | |
5 … | + | |
6 … | +# [SectionType SectionName] | |
7 … | +# key1 = value1 | |
8 … | +# key2 = value2 | |
9 … | + | |
10 … | +# SECTION HEADERS | |
11 … | +# Section headers are formatted like this: | |
12 … | +# [SectionType Label] | |
13 … | +# Where SectionType is either "Global" "Style" "Account" or "CheckBlank" | |
14 … | +# Label is the name of this particularinition | |
15 … | +# i.e. [Style Normal] is the section that defines the normal style (!) | |
16 … | +# The "Global" section does not take a SectionType | |
17 … | +# i.e. [Global] | |
18 … | +# No part of the header is case sensitive | |
19 … | + | |
20 … | + | |
21 … | +# KEY-VALUE PAIRS | |
22 … | +# Key-value pairs are separated by an "=" with optional whitespace | |
23 … | +# i.e. "Key1 = Value1" or "Key1=Value1" | |
24 … | +# Key names ARE case-sensitive, since they become PostScriptinitions | |
25 … | +# Some values (such as font names) are case sensitive | |
26 … | +# Others, such as address strings, will print in whatever case you enter them | |
27 … | +# Values may be multiple words | |
28 … | +# Values which represent dimensions may be bare numbers (which results in | |
29 … | +# "points," or 1/72 of an inch) or followed by "inch" which should be | |
30 … | +# self-explanatory. | |
31 … | + | |
32 … | +# Each section contains comments showing all required key-value pairs, and | |
33 … | +# examples of assignments. | |
34 … | + | |
35 … | +################### | |
36 … | +# Global defaults # | |
37 … | +################### | |
38 … | + | |
39 … | +# Keys: | |
40 … | + | |
41 … | +# MICR Font | |
42 … | +# --------- | |
43 … | +# For the MICR font, SIZE MATTERS! Make sure you have the right point | |
44 … | +# size for the particular MICR font you're using. Most (including | |
45 … | +# GnuMICR) are correct at 12 pts, but READ THE DOCS THAT CAME WITH | |
46 … | +# THE FONT! :) | |
47 … | + | |
48 … | +# MICRFontName = GnuMICR | |
49 … | +# MICRFontSize = 12 | |
50 … | + | |
51 … | +# MICR Symbol Mapping | |
52 … | +# ------------------- | |
53 … | +# Maps which characters show which MICR symbols in the font you're using | |
54 … | +# Approximate representations of these symbols, with names, below: | |
55 … | +# |: = TransitSymbol | |
56 … | +# / = Amount | |
57 … | +# P = OnUs | |
58 … | +# - = Dash | |
59 … | + | |
60 … | +# TransitSymbol = A | |
61 … | +# OnUsSymbol = C | |
62 … | +# AmountSymbol = B | |
63 … | +# DashSymbol = D | |
64 … | + | |
65 … | +# MICR Line placement "Tweaking" | |
66 … | +#------------------------------- | |
67 … | +# Any "tweaks" necessary to align the MICR characters | |
68 … | +# May be in points or in inches | |
69 … | +# MICRVerTweak = 0 | |
70 … | +# MICRHorTweak = 0 | |
71 … | + | |
72 … | +[Global] | |
73 … | +MICRFontName = GnuMICR | |
74 … | +MICRFontSize = 12 | |
75 … | +TransitSymbol = A | |
76 … | +OnUsSymbol = C | |
77 … | +AmountSymbol = B | |
78 … | +DashSymbol = D | |
79 … | +MICRVerTweak = 0 | |
80 … | +MICRHorTweak = 0 | |
81 … | + | |
82 … | +############ | |
83 … | +# Accounts # | |
84 … | +############ | |
85 … | + | |
86 … | +# Check number for first check on the page | |
87 … | +# CheckNumber = 441 | |
88 … | + | |
89 … | +# Check Parts to print | |
90 … | +# -------------------- | |
91 … | +# What exactly do we want to print? This is so that people can use | |
92 … | +# special MICR toner if they want, and print two-pass | |
93 … | +# PrintCheckBody = true | |
94 … | +# PrintMICRLine = true | |
95 … | + | |
96 … | +# Number of pages to print | |
97 … | +# NumPages = 3 | |
98 … | + | |
99 … | +# Account Holder's Name, etc | |
100 … | +# -------------------------- | |
101 … | +# If any strings are empty, they will not be printed | |
102 … | + | |
103 … | +# Name1 = JOHN SMITH | |
104 … | +# Name2 = MARY SMITH | |
105 … | +# Address1 = 1234 Main Street | |
106 … | +# Address2 = | |
107 … | +# CityStateZip = Anytown, USA 12345 | |
108 … | +# PhoneNumber = 512-555-1212 | |
109 … | + | |
110 … | +# Bank information | |
111 … | +# ---------------- | |
112 … | +# If any strings are empty, they will not be printed | |
113 … | +# BankName = MegaCorp Bank, NA | |
114 … | +# BankAddr1 = 6780 Main Street | |
115 … | +# BankAddr2 = Suite 45 | |
116 … | +# BankCityStateZip = Anytown, USA 12345 | |
117 … | + | |
118 … | +# Account Information | |
119 … | +# ------------------- | |
120 … | + | |
121 … | +# RoutingNumber = 012345678 # Leftmost MICR numbers | |
122 … | +# AccountNumber = 1234567890 # Middle MICR numbers | |
123 … | +# Fraction = 12345/67890 # Fraction at top of check | |
124 … | + | |
125 … | +[Account Sample] | |
126 … | +PrintCheckBody = true | |
127 … | +CheckNumber = 100 | |
128 … | +PrintMICRLine = true | |
129 … | +NumPages = 2 | |
130 … | +Name1 = JOHN SMITH | |
131 … | +Name2 = MARY SMITH | |
132 … | +Address1 = 1234 Main Street | |
133 … | +Address2 = | |
134 … | +CityStateZip = Anytown, USA 12345 | |
135 … | +PhoneNumber = 512-555-1212 | |
136 … | +BankName = MegaCorp Bank, NA | |
137 … | +BankAddr1 = 6780 Main Street | |
138 … | +BankAddr2 = Suite 45 | |
139 … | +BankCityStateZip = Anytown, USA 12345 | |
140 … | +RoutingNumber = 012345678 | |
141 … | +AccountNumber = 1234567890 | |
142 … | +Fraction = 12345/67890 | |
143 … | + | |
144 … | +################ | |
145 … | +# Check Styles # | |
146 … | +################ | |
147 … | + | |
148 … | +# Font Names & Sizes | |
149 … | +# ------------------ | |
150 … | +# The StandardFontSize is just the basic size for non-MICR | |
151 … | +# text. Things get scaled a bit from there (Names are larger than | |
152 … | +# addresses, etc) | |
153 … | +# StandardFontName = AvantGarde-Book | |
154 … | +# StandardFontSize = 9 | |
155 … | + | |
156 … | +# This is NOT THE MICR FONT! It is the big check number on top right | |
157 … | +# CheckNumFont = Helvetica-Bold | |
158 … | +# CheckNumSize = 14 | |
159 … | + | |
160 … | +# Check feature placement | |
161 … | +# ----------------------- | |
162 … | +# (relative to bottom of check) | |
163 … | +# Currently implemented as multiples of the check height | |
164 … | +# Could be absolute (inches) but would break across different | |
165 … | +# types of check blanks | |
166 … | +# MemoLineHeight = 0.25 CheckHeight mul | |
167 … | +# SignatureLineHeight = 0.25 CheckHeight mul | |
168 … | +# BankInfoHeight = 0.45 CheckHeight mul | |
169 … | +# AmountLineHeight = 0.50 CheckHeight mul | |
170 … | +# PayeeLineHeight = 0.60 CheckHeight mul | |
171 … | +# DateLineHeight = 0.75 CheckHeight mul | |
172 … | + | |
173 … | +[Style Normal] | |
174 … | +StandardFontName = AvantGarde-Book | |
175 … | +StandardFontSize = 9 | |
176 … | +CheckNumFont = Helvetica-Bold | |
177 … | +CheckNumSize = 14 | |
178 … | +MemoLineHeight = 0.25 CheckHeight mul | |
179 … | +SignatureLineHeight = 0.25 CheckHeight mul | |
180 … | +BankInfoHeight = 0.45 CheckHeight mul | |
181 … | +AmountLineHeight = 0.50 CheckHeight mul | |
182 … | +PayeeLineHeight = 0.60 CheckHeight mul | |
183 … | +DateLineHeight = 0.75 CheckHeight mul | |
184 … | + | |
185 … | +################ | |
186 … | +# CHECK BLANKS # | |
187 … | +################ | |
188 … | + | |
189 … | +# Keys: | |
190 … | + | |
191 … | +# Information about how the checks are laid out on the page | |
192 … | +# --------------------------------------------------------- | |
193 … | + | |
194 … | +# Actual width and height of the checks, in points or inches | |
195 … | +# CheckHeight = 3.50 inch | |
196 … | +# CheckWidth = 8.50 inch | |
197 … | + | |
198 … | +# Offsets for bottom-most check, from lower left corner of page | |
199 … | +# In points or inches | |
200 … | +# CheckHorOffset = 0.00 inch | |
201 … | +# CheckVerOffset = 4.00 inch | |
202 … | + | |
203 … | +# Number of checks on each page | |
204 … | +# ChecksPerPage = 1 | |
205 … | + | |
206 … | +# Information about where to print on each check | |
207 … | +# ---------------------------------------------- | |
208 … | + | |
209 … | +# Margins within each check - to avoid any graphics on the check blanks | |
210 … | +# (Bottom margin fixed by MICR spec) | |
211 … | +# LeftMargin = 0.40 inch | |
212 … | +# RightMargin = 0.40 inch | |
213 … | +# TopMargin = 0.25 inch | |
214 … | + | |
215 … | +[CheckBlank MVD1001] | |
216 … | +# MIP/SDLA VersaCheck MVD1001 "Business" checks | |
217 … | +CheckHeight = 3.50 inch | |
218 … | +CheckWidth = 8.50 inch | |
219 … | +CheckHorOffset = 0.00 inch | |
220 … | +CheckVerOffset = 4.00 inch | |
221 … | +ChecksPerPage = 1 | |
222 … | +LeftMargin = 0.40 inch | |
223 … | +RightMargin = 0.40 inch | |
224 … | +TopMargin = 0.25 inch | |
225 … | + | |
226 … | +[CheckBlank MVG1000] | |
227 … | +# MIPS/DLA VersaCheck MVG1000 "Business" checks | |
228 … | +CheckHeight = 3.50 inch | |
229 … | +CheckWidth = 8.50 inch | |
230 … | +CheckHorOffset = 0.00 inch | |
231 … | +CheckVerOffset = 7.50 inch | |
232 … | +ChecksPerPage = 1 | |
233 … | +LeftMargin = 0.30 inch | |
234 … | +RightMargin = 0.30 inch | |
235 … | +TopMargin = 0.25 inch | |
236 … | + | |
237 … | +[CheckBlank MVG3001] | |
238 … | +# MIPS/DLA VersaCheck MVG3001 "Personal" checks | |
239 … | +CheckHeight = 2.83 inch | |
240 … | +CheckWidth = 6.00 inch | |
241 … | +CheckHorOffset = 2.50 inch | |
242 … | +CheckVerOffset = 2.50 inch | |
243 … | +ChecksPerPage = 3 | |
244 … | +LeftMargin = 0.20 inch | |
245 … | +RightMargin = 0.25 inch | |
246 … | +TopMargin = 0.20 inch |
freecheck.pl | |||
---|---|---|---|
@@ -1,0 +1,640 @@ | |||
1 … | +#!/usr/bin/perl | ||
2 … | + | ||
3 … | +#--------------- | ||
4 … | +# | ||
5 … | +# FreeCheck - a free check printing application released | ||
6 … | +# under the GNU General Public Licene. | ||
7 … | +# | ||
8 … | +# Copyright (C) 2000 Eric Sandeen (eric_sandeen@bigfoot.com) | ||
9 … | +# | ||
10 … | +# This program is free software; you can redistribute it and/or modify | ||
11 … | +# it under the terms of the GNU General Public License as published by | ||
12 … | +# the Free Software Foundation; either version 2 of the License, or | ||
13 … | +# (at your option) any later version. | ||
14 … | +# | ||
15 … | +# This program is distributed in the hope that it will be useful, | ||
16 … | +# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
17 … | +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
18 … | +# GNU General Public License for more details. | ||
19 … | +# | ||
20 … | +# You should have received a copy of the GNU General Public License | ||
21 … | +# along with this program; if not, write to the Free Software | ||
22 … | +# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||
23 … | +# | ||
24 … | +#--------------- | ||
25 … | + | ||
26 … | +$ConfigFile = "freecheck.cfg"; | ||
27 … | + | ||
28 … | +# Some defaults... | ||
29 … | +$opt_account = "sample"; | ||
30 … | +$opt_checktype = "MVG3001"; | ||
31 … | +$opt_checkstyle = "normal"; | ||
32 … | + | ||
33 … | +use Getopt::Long; | ||
34 … | +#use Carp; | ||
35 … | + | ||
36 … | +#use File::Slurp; | ||
37 … | + | ||
38 … | +# This tells us how to format the strings from the cfg file | ||
39 … | +# so we can print it as a PostScript definition | ||
40 … | +# The key read will replace "value" for each of these | ||
41 … | +# Strings are enclosed in parentheses (String) (Foobar) | ||
42 … | +# Fonts are preceded by a "/" /FontName /Arial | ||
43 … | +# Digits are fine as they are Digit 123 | ||
44 … | +# Booleans are fine too Bool true | ||
45 … | +# But to be safe, do digits and bools as subroutines: | ||
46 … | +# Subroutines are in {} {subr} {3 mul} | ||
47 … | + | ||
48 … | +%Formats = qw( | ||
49 … | + # Globals | ||
50 … | + MICRFontName /value | ||
51 … | + MICRFontSize {value} | ||
52 … | + TransitSymbol (value) | ||
53 … | + OnUsSymbol (value) | ||
54 … | + AmountSymbol (value) | ||
55 … | + DashSymbol (value) | ||
56 … | + MICRVerTweak {value} | ||
57 … | + MICRHorTweak {value} | ||
58 … | + # Account | ||
59 … | + CheckNumber {value} | ||
60 … | + PrintCheckBody {value} | ||
61 … | + PrintMICRLine {value} | ||
62 … | + NumPages {value} | ||
63 … | + Name1 (value) | ||
64 … | + Name2 (value) | ||
65 … | + Address1 (value) | ||
66 … | + Address2 (value) | ||
67 … | + CityStateZip (value) | ||
68 … | + PhoneNumber (value) | ||
69 … | + BankName (value) | ||
70 … | + BankAddr1 (value) | ||
71 … | + BankAddr2 (value) | ||
72 … | + BankCityStateZip (value) | ||
73 … | + RoutingNumber (value) | ||
74 … | + AccountNumber (value) | ||
75 … | + Fraction (value) | ||
76 … | + PrintVOID {value} | ||
77 … | + # Styles | ||
78 … | + StandardFontName /value | ||
79 … | + StandardFontSize {value} | ||
80 … | + CheckNumFont /value | ||
81 … | + CheckNumSize {value} | ||
82 … | + MemoLineHeight {value} | ||
83 … | + SignatureLineHeight {value} | ||
84 … | + BankInfoHeight {value} | ||
85 … | + AmountLineHeight {value} | ||
86 … | + PayeeLineHeight {value} | ||
87 … | + DateLineHeight {value} | ||
88 … | + # Check Blank Types | ||
89 … | + CheckHeight {value} | ||
90 … | + CheckWidth {value} | ||
91 … | + CheckHorOffset {value} | ||
92 … | + CheckVerOffset {value} | ||
93 … | + ChecksPerPage {value} | ||
94 … | + LeftMargin {value} | ||
95 … | + RightMargin {value} | ||
96 … | + TopMargin {value} | ||
97 … | + ); | ||
98 … | + | ||
99 … | +# Parse command line options and deal with them: | ||
100 … | + | ||
101 … | +GetOptions ("account:s", # Account definition file | ||
102 … | + "checknum:i", # Check number optional (overrides acct file) | ||
103 … | + "pages:i", # Number of pages to print | ||
104 … | + "checkstyle:s", # Check style (defaults to "normal_style.ps" | ||
105 … | + "checktype:s", # Check blank definition | ||
106 … | + "nomicr", # Prevents MICR line from printing (body only) | ||
107 … | + "nobody", # Prevents body from printing (MICR line only) | ||
108 … | + "test", # Don't increment check no. and print VOID | ||
109 … | + "help") | ||
110 … | + | ||
111 … | +or Show_Usage(); | ||
112 … | + | ||
113 … | +if ($opt_help) { | ||
114 … | + Show_Usage(); | ||
115 … | +} | ||
116 … | + | ||
117 … | +# Pull the config file into a string... | ||
118 … | +$config_file = read_file($ConfigFile); | ||
119 … | + | ||
120 … | +# Go through the config and fill up a hash with PostScript defines... | ||
121 … | +Parse_Config($config_file); | ||
122 … | + | ||
123 … | +# Overwrite anything we got from the config file with what was on the | ||
124 … | +# Command Line (if anything...) | ||
125 … | + | ||
126 … | +if ($opt_checknum) { | ||
127 … | + $Definitions{"CheckNumber"} = $opt_checknum; | ||
128 … | +} | ||
129 … | + | ||
130 … | +if ($opt_pages) { | ||
131 … | + $Definitions{"NumPages"} = $opt_pages; | ||
132 … | +} | ||
133 … | + | ||
134 … | +if ($opt_nomicr) { | ||
135 … | + $Definitions{"PrintMICRLine"} = "false"; | ||
136 … | +} | ||
137 … | + | ||
138 … | +if ($opt_nobody) { | ||
139 … | + $Definitions{"PrintCheckBody"} = "false"; | ||
140 … | +} | ||
141 … | + | ||
142 … | +# This probably isn't in the config file (although it might be...) | ||
143 … | +# so cover both possibilites (true/false) | ||
144 … | +if ($opt_test) { | ||
145 … | + $Definitions{"PrintVOID"} = "true"; | ||
146 … | +} else { | ||
147 … | + $Definitions{"PrintVOID"} = "false"; | ||
148 … | +} | ||
149 … | + | ||
150 … | +# Print PostScript | ||
151 … | + | ||
152 … | +# Initial stuff: | ||
153 … | + | ||
154 … | +print "%!\n"; | ||
155 … | +print "/inch {72 mul} def\n"; | ||
156 … | + | ||
157 … | +# Go through $Definitions and print them out PostScript-Like | ||
158 … | +Print_Defs(); | ||
159 … | + | ||
160 … | +# Then print the main body | ||
161 … | +Print_Body(); | ||
162 … | + | ||
163 … | +# Update the config file with the new check number, if it's not just a test | ||
164 … | +if (!$opt_test) { | ||
165 … | + $next_check_number = $Definitions{"CheckNumber"} | ||
166 … | + + ($Definitions{"NumPages"} * $Definitions{"ChecksPerPage"}); | ||
167 … | + | ||
168 … | + $config_file = Replace_Val($config_file, "Account", $opt_account, | ||
169 … | + "CheckNumber", $next_check_number); | ||
170 … | + write_file ("freecheck.cfg", $config_file); | ||
171 … | +} | ||
172 … | + | ||
173 … | +############### | ||
174 … | +# Subroutines # | ||
175 … | +############### | ||
176 … | + | ||
177 … | +# read_file and write_file shamelessly stolen from the File::Slurp module | ||
178 … | +# Short enough, and I didn't want to require a non-standard module | ||
179 … | + | ||
180 … | +sub read_file | ||
181 … | +{ | ||
182 … | + my ($file) = @_; | ||
183 … | + | ||
184 … | + local(*F); | ||
185 … | + my $r; | ||
186 … | + my (@r); | ||
187 … | + | ||
188 … | + open(F, "<$file") || die "open $file: $!"; | ||
189 … | + @r = <F>; | ||
190 … | + close(F); | ||
191 … | + | ||
192 … | + return @r if wantarray; | ||
193 … | + return join("",@r); | ||
194 … | +} | ||
195 … | + | ||
196 … | +sub write_file | ||
197 … | +{ | ||
198 … | + my ($f, @data) = @_; | ||
199 … | + | ||
200 … | + local(*F); | ||
201 … | + | ||
202 … | + open(F, ">$f") || die "open >$f: $!"; | ||
203 … | + (print F @data) || die "write $f: $!"; | ||
204 … | + close(F) || die "close $f: $!"; | ||
205 … | + return 1; | ||
206 … | +} | ||
207 … | + | ||
208 … | + | ||
209 … | +sub Parse_Config { | ||
210 … | + local ($config_file) = ($_[0]); | ||
211 … | + # Find each section we're looking for... | ||
212 … | + while ($config_file =~ /^\[\s*( | ||
213 … | + Global | | ||
214 … | + Account\s+${opt_account} | | ||
215 … | + Style\s+${opt_checkstyle} | | ||
216 … | + CheckBlank\s+${opt_checktype} | ||
217 … | + )\s*\]/xmgci) { | ||
218 … | + # and get the lines under it one by one | ||
219 … | + while ($config_file =~ /(^.+$)/mgc) { | ||
220 … | + $line = $+; | ||
221 … | + # If this line is a comment, skip it | ||
222 … | + if ($line =~ /^#/) { | ||
223 … | + next; | ||
224 … | + } | ||
225 … | + # If the line we just found is a new section..."[...]" | ||
226 … | + if ($line =~ /\[.+\]/) { | ||
227 … | + # and it is another section we're looking for | ||
228 … | + # Grab the next line, and keep going | ||
229 … | + if ($line =~ /\[\s*( | ||
230 … | + Global | | ||
231 … | + Account\s+${opt_account} | | ||
232 … | + Style\s+${opt_checkstyle} | | ||
233 … | + CheckBlank\s+${opt_checktype} | ||
234 … | + )\s*]/xi) { | ||
235 … | + # Grab the next line, and keep going | ||
236 … | + next; | ||
237 … | + } else { | ||
238 … | + # Not a section we need, so break out | ||
239 … | + # of the loop | ||
240 … | + last; | ||
241 … | + } | ||
242 … | + } | ||
243 … | + | ||
244 … | + ($key, $val) = split (/\s*=\s*/,$line); | ||
245 … | + $Definitions{$key} = $val; | ||
246 … | + } # line-by-line while | ||
247 … | + } # section match conditional | ||
248 … | +} | ||
249 … | + | ||
250 … | +sub Replace_Val { | ||
251 … | + local ($string, $section, $name, $key, $value) = | ||
252 … | + ($_[0], $_[1], $_[2], $_[3], $_[4]); | ||
253 … | + # We want to get "[section name] ... key = value" and replace it | ||
254 … | + # with the new value. | ||
255 … | + | ||
256 … | + # s - "." matches ANYTHING including newline | ||
257 … | + # m - ^ and $ match after and before any newline | ||
258 … | + # in this case, ".+?" means the minimum number of <anything> i.e. end | ||
259 … | + # when we find the first instance of $key after [section name] | ||
260 … | + $string =~ | ||
261 … | + s/(^\[\s*$section\s+$name\s*\].+?^${key}\s*=\s*).*?$/$+$value/smi; | ||
262 … | + $string; | ||
263 … | +} | ||
264 … | + | ||
265 … | +sub Show_Usage { | ||
266 … | + print "\nFreeCheck v. 0.1 - a Free Check printing Utility\n\n"; | ||
267 … | + print "Usage: freecheck <options>:\n"; | ||
268 … | + print "\n"; | ||
269 … | + print "options:\n"; | ||
270 … | + print " --account <filename> account to use (default \"$opt_account\")\n"; | ||
271 … | + print " --checknum <integer> starting check number (overrides cfg)\n"; | ||
272 … | + print " --pages <integer> number of pages to print (overrides cfg)\n"; | ||
273 … | + print " --checkstyle <filename> check style to use (default \"$opt_checkstyle\")\n"; | ||
274 … | + print " --checktype <filename> blank check type to use (default \"$opt_checktype\")\n"; | ||
275 … | + print " --nomicr print check body only, no MICR line\n"; | ||
276 … | + print " --nobody print MICR line only, no check body\n"; | ||
277 … | + print " --help print this message\n"; | ||
278 … | + print " --test print but don't increment check number\n"; | ||
279 … | + print " and print VOID on the check\n"; | ||
280 … | + print "\nconfig file \"freecheck.cfg\" must be in the same directory,\n"; | ||
281 … | + print "as the freecheck executable (this will change in the future...)\n"; | ||
282 … | + die "\n"; | ||
283 … | +} | ||
284 … | + | ||
285 … | +sub Print_Defs { | ||
286 … | + # Go through each def in the hash table, and print according to the | ||
287 … | + # formatting hash | ||
288 … | + while ( ($key, $val) = each (%Definitions) ) { | ||
289 … | + print "/$key\t"; | ||
290 … | + $_ = $Formats{$key}; | ||
291 … | + s/value/$val/; | ||
292 … | + print; | ||
293 … | + print " def\n"; | ||
294 … | + } | ||
295 … | +} | ||
296 … | + | ||
297 … | +sub Print_Body { | ||
298 … | + | ||
299 … | +# This is the main body of the postscript file, that acts on all of the | ||
300 … | +# definitions we got from the config file. | ||
301 … | + | ||
302 … | +print ' | ||
303 … | + % Other Constants: | ||
304 … | + | ||
305 … | + % Size of the rectangular box for the amount (digits) | ||
306 … | + /AmountBoxWidth {1 inch} def | ||
307 … | + /AmountBoxHeight {0.25 inch} def | ||
308 … | + | ||
309 … | + /LineWidth {0.3} def | ||
310 … | + | ||
311 … | + % Max number of digits in check number, and allocate string | ||
312 … | + /CheckNumDigits 4 def | ||
313 … | + /CheckNumberString CheckNumDigits string def | ||
314 … | + | ||
315 … | + %%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
316 … | + % Helpful Printing Routines % | ||
317 … | + %%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
318 … | + | ||
319 … | + % Shows a line, then does a "carriage return / line feed" | ||
320 … | + % But only if the string exists (more than 0 chars) | ||
321 … | + % (How do we get the current font size (height)?) | ||
322 … | + | ||
323 … | + /ShowAndCR { | ||
324 … | + % A couple copies of the string (now 3 on stack) | ||
325 … | + dup dup | ||
326 … | + length 0 gt { % First copy | ||
327 … | + show % Second copy | ||
328 … | + stringwidth pop neg 0 rmoveto % Third copy & move back | ||
329 … | + neg 0 exch rmoveto % line down | ||
330 … | + } if | ||
331 … | + } def | ||
332 … | + | ||
333 … | + %%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
334 … | + % Feature Printing Routines % | ||
335 … | + %%%%%%%%%%%%%%%%%%%%%%%%%%%%% | ||
336 … | + | ||
337 … | + /DrawMemoLine { | ||
338 … | + LeftMargin MemoLineHeight moveto | ||
339 … | + 2.5 inch 0 inch rlineto | ||
340 … | + -2.5 inch 0 inch rmoveto | ||
341 … | + 0 2 rmoveto | ||
342 … | + (for) show | ||
343 … | + } def | ||
344 … | + | ||
345 … | + /DrawSignatureLine { % Expects height of signature line | ||
346 … | + % and right edge of check for | ||
347 … | + % beginning position | ||
348 … | + | ||
349 … | + CheckWidth SignatureLineHeight moveto | ||
350 … | + RightMargin neg 0 rmoveto | ||
351 … | + -2.5 inch 0 rmoveto | ||
352 … | + 2.5 inch 0 inch rlineto | ||
353 … | + | ||
354 … | + } def | ||
355 … | + | ||
356 … | + /DrawAmountLine { | ||
357 … | + CheckWidth AmountLineHeight moveto | ||
358 … | + RightMargin neg 0 rmoveto | ||
359 … | + (DOLLARS) stringwidth pop neg 0 rmoveto | ||
360 … | + (DOLLARS) show | ||
361 … | + (DOLLARS) stringwidth pop neg 0 rmoveto | ||
362 … | + -2 0 rmoveto | ||
363 … | + LeftMargin AmountLineHeight lineto | ||
364 … | + } def | ||
365 … | + | ||
366 … | + /DrawAccountHolderInfo { | ||
367 … | + LeftMargin CheckHeight moveto | ||
368 … | + 0 TopMargin neg rmoveto | ||
369 … | + 0 StandardFontSize neg rmoveto | ||
370 … | + | ||
371 … | + | ||
372 … | + StandardFontSize Name1 ShowAndCR | ||
373 … | + %Name1 show | ||
374 … | + %Name1 stringwidth pop neg StandardFontSize neg rmoveto | ||
375 … | + | ||
376 … | + | ||
377 … | + StandardFontSize Name2 ShowAndCR | ||
378 … | + % Show Name2 only if present | ||
379 … | + %Name2 length 0 gt { | ||
380 … | + % Name2 show | ||
381 … | + % Name2 stringwidth pop neg StandardFontSize neg rmoveto | ||
382 … | + %} if | ||
383 … | + | ||
384 … | + StandardFontName findfont | ||
385 … | + StandardFontSize 1 sub scalefont | ||
386 … | + setfont | ||
387 … | + | ||
388 … | + StandardFontSize 1 sub Address1 ShowAndCR | ||
389 … | + %Address1 stringwidth pop neg StandardFontSize neg rmoveto | ||
390 … | + | ||
391 … | + % Show Address2 only if present | ||
392 … | + Address2 length 0 gt { | ||
393 … | + Address2 show | ||
394 … | + Address2 stringwidth pop neg StandardFontSize neg rmoveto | ||
395 … | + } if | ||
396 … | + | ||
397 … | + CityStateZip show | ||
398 … | + CityStateZip stringwidth pop neg StandardFontSize neg rmoveto | ||
399 … | + | ||
400 … | + % Show PhoneNumber only if present | ||
401 … | + PhoneNumber length 0 gt { | ||
402 … | + PhoneNumber show | ||
403 … | + PhoneNumber stringwidth pop neg StandardFontSize neg rmoveto | ||
404 … | + } if | ||
405 … | + | ||
406 … | + StandardFontName findfont | ||
407 … | + StandardFontSize 1 add scalefont | ||
408 … | + setfont | ||
409 … | + } def | ||
410 … | + | ||
411 … | + /DrawDateLine { | ||
412 … | + 0.6 CheckWidth mul DateLineHeight moveto | ||
413 … | + (Date) show | ||
414 … | + 1 inch 0 rlineto | ||
415 … | + } def | ||
416 … | + | ||
417 … | + /DrawBankInfo { | ||
418 … | + LeftMargin BankInfoHeight moveto | ||
419 … | + | ||
420 … | + BankName show | ||
421 … | + BankName stringwidth pop neg StandardFontSize neg rmoveto | ||
422 … | + | ||
423 … | + StandardFontName findfont | ||
424 … | + StandardFontSize 1 sub scalefont | ||
425 … | + setfont | ||
426 … | + | ||
427 … | + BankAddr1 show | ||
428 … | + BankAddr1 stringwidth pop neg StandardFontSize neg rmoveto | ||
429 … | + | ||
430 … | + % Show Addr2 only if present | ||
431 … | + BankAddr2 length 0 gt { | ||
432 … | + BankAddr2 show | ||
433 … | + BankAddr2 stringwidth pop neg StandardFontSize neg rmoveto | ||
434 … | + } if | ||
435 … | + | ||
436 … | + BankCityStateZip show | ||
437 … | + BankCityStateZip stringwidth pop neg StandardFontSize neg rmoveto | ||
438 … | + | ||
439 … | + StandardFontName findfont | ||
440 … | + StandardFontSize 1 add scalefont | ||
441 … | + setfont | ||
442 … | + } def | ||
443 … | + | ||
444 … | + /DrawPayeeLine { | ||
445 … | + | ||
446 … | + LeftMargin PayeeLineHeight moveto | ||
447 … | + (ORDER OF) show | ||
448 … | + (ORDER OF) stringwidth pop neg StandardFontSize rmoveto | ||
449 … | + (PAY TO THE) show | ||
450 … | + 0 StandardFontSize neg rmoveto | ||
451 … | + 4 0 rmoveto | ||
452 … | + currentpoint mark | ||
453 … | + | ||
454 … | + CheckWidth PayeeLineHeight moveto | ||
455 … | + RightMargin neg 0 rmoveto | ||
456 … | + AmountBoxWidth neg 0 rmoveto | ||
457 … | + | ||
458 … | + 0 AmountBoxHeight rlineto | ||
459 … | + AmountBoxWidth 0 rlineto | ||
460 … | + 0 AmountBoxHeight neg rlineto | ||
461 … | + AmountBoxWidth neg 0 rlineto | ||
462 … | + | ||
463 … | + -4 0 rmoveto | ||
464 … | + | ||
465 … | + /Helvetica-Bold findfont | ||
466 … | + 14 scalefont | ||
467 … | + setfont | ||
468 … | + | ||
469 … | + ($) stringwidth pop neg 0 rmoveto | ||
470 … | + ($) show | ||
471 … | + ($) stringwidth pop neg 0 rmoveto | ||
472 … | + | ||
473 … | + -4 0 rmoveto | ||
474 … | + cleartomark | ||
475 … | + lineto | ||
476 … | + | ||
477 … | + StandardFontName findfont | ||
478 … | + StandardFontSize scalefont | ||
479 … | + setfont | ||
480 … | + | ||
481 … | + } def | ||
482 … | + | ||
483 … | + /DrawMICR { | ||
484 … | + % 0.25 high, 5.6875 from right edge should be in the middle | ||
485 … | + % of the tolerance band | ||
486 … | + CheckWidth 0.25 inch moveto | ||
487 … | + -5.6875 inch 0 inch rmoveto | ||
488 … | + MICRHorTweak MICRVerTweak rmoveto | ||
489 … | + | ||
490 … | + save | ||
491 … | + MICRFontName findfont | ||
492 … | + MICRFontSize scalefont | ||
493 … | + setfont | ||
494 … | + TransitSymbol show | ||
495 … | + RoutingNumber show | ||
496 … | + TransitSymbol show | ||
497 … | + ( ) show | ||
498 … | + % Pad with spaces if acct number is short | ||
499 … | + 12 AccountNumber length sub {( ) show} repeat | ||
500 … | + AccountNumber show | ||
501 … | + OnUsSymbol show | ||
502 … | + ( ) show | ||
503 … | + % Same deal, pad w/ 0s if short check number | ||
504 … | + CheckNumDigits 1 sub -1 1 | ||
505 … | + {CheckNumberString exch get 0 eq {(0) show} if } for | ||
506 … | + CheckNumberString show | ||
507 … | + restore | ||
508 … | + } def | ||
509 … | + | ||
510 … | + /DrawCheckNumber { | ||
511 … | + CheckWidth CheckHeight moveto | ||
512 … | + RightMargin neg TopMargin neg rmoveto | ||
513 … | + CheckNumFont findfont | ||
514 … | + CheckNumSize scalefont | ||
515 … | + setfont | ||
516 … | + | ||
517 … | + CheckNumberString stringwidth pop neg 0 rmoveto | ||
518 … | + 0 -14 rmoveto | ||
519 … | + CheckNumberString show | ||
520 … | + | ||
521 … | + StandardFontName findfont | ||
522 … | + StandardFontSize scalefont | ||
523 … | + setfont | ||
524 … | + } def | ||
525 … | + | ||
526 … | + /DrawFraction { | ||
527 … | + 0.6 CheckWidth mul CheckHeight moveto | ||
528 … | + 0 TopMargin neg rmoveto | ||
529 … | + 0 StandardFontSize neg rmoveto | ||
530 … | + Fraction show | ||
531 … | + } def | ||
532 … | + | ||
533 … | + /DrawStub { | ||
534 … | + CheckHorOffset 2 inch ge { | ||
535 … | + save | ||
536 … | + newpath | ||
537 … | + CheckHorOffset neg 0 translate | ||
538 … | + StandardFontName findfont | ||
539 … | + StandardFontSize 1 sub scalefont | ||
540 … | + setfont | ||
541 … | + /StubSpacing {CheckHeight 6 div} def | ||
542 … | + CheckHorOffset 2 div StubSpacing 5 mul moveto | ||
543 … | + CheckNumberString show | ||
544 … | + 0.3 inch StubSpacing 4 mul moveto | ||
545 … | + (Date ) show | ||
546 … | + CheckHorOffset 0.3 inch sub StubSpacing 4 mul lineto | ||
547 … | + 0.3 inch StubSpacing 3 mul moveto | ||
548 … | + (Payee ) show | ||
549 … | + CheckHorOffset 0.3 inch sub StubSpacing 3 mul lineto | ||
550 … | + 0.3 inch StubSpacing 2 mul moveto | ||
551 … | + (Amount ) show | ||
552 … | + CheckHorOffset 0.3 inch sub StubSpacing 2 mul lineto | ||
553 … | + 0.3 inch StubSpacing 1 mul moveto | ||
554 … | + (Memo ) show | ||
555 … | + CheckHorOffset 0.3 inch sub StubSpacing 1 mul lineto | ||
556 … | + stroke | ||
557 … | + restore | ||
558 … | + } if | ||
559 … | + } def | ||
560 … | + | ||
561 … | + /DrawVOID { | ||
562 … | + save | ||
563 … | + StandardFontName findfont | ||
564 … | + 50 scalefont | ||
565 … | + setfont | ||
566 … | + newpath | ||
567 … | + CheckWidth 2 div 1 inch moveto | ||
568 … | + 30 rotate | ||
569 … | + (V O I D) stringwidth pop 0 moveto | ||
570 … | + (V O I D) true charpath | ||
571 … | + stroke | ||
572 … | + restore | ||
573 … | + } def | ||
574 … | + | ||
575 … | + /DrawCheck { | ||
576 … | + % Temporarily draw boxes around the checks | ||
577 … | + 0 0 moveto | ||
578 … | + CheckWidth 0 lineto | ||
579 … | + CheckWidth CheckHeight lineto | ||
580 … | + 0 CheckHeight lineto | ||
581 … | + 0 0 lineto | ||
582 … | + | ||
583 … | + % Convert CheckNumber integer to a string | ||
584 … | + PrintCheckBody { | ||
585 … | + CheckNumber CheckNumberString cvs | ||
586 … | + DrawBankInfo | ||
587 … | + DrawAccountHolderInfo | ||
588 … | + DrawMemoLine | ||
589 … | + DrawSignatureLine | ||
590 … | + DrawAmountLine | ||
591 … | + DrawPayeeLine | ||
592 … | + DrawCheckNumber | ||
593 … | + DrawFraction | ||
594 … | + DrawDateLine | ||
595 … | + } if | ||
596 … | + | ||
597 … | + PrintMICRLine { | ||
598 … | + DrawMICR | ||
599 … | + } if | ||
600 … | + | ||
601 … | + PrintVOID { | ||
602 … | + DrawVOID | ||
603 … | + } if | ||
604 … | + | ||
605 … | + } def | ||
606 … | + | ||
607 … | + | ||
608 … | + /CurrentPage 1 def | ||
609 … | + | ||
610 … | + NumPages -1 1 { | ||
611 … | + /CheckNumber CheckNumber ChecksPerPage add def | ||
612 … | + CheckHorOffset CheckVerOffset translate | ||
613 … | + | ||
614 … | + StandardFontName findfont | ||
615 … | + StandardFontSize scalefont | ||
616 … | + setfont | ||
617 … | + | ||
618 … | + LineWidth setlinewidth | ||
619 … | + | ||
620 … | + % Loop through printing checks, starting with the bottom one | ||
621 … | + | ||
622 … | + ChecksPerPage -1 1 { | ||
623 … | + /CheckNumber CheckNumber 1 sub def | ||
624 … | + newpath | ||
625 … | + | ||
626 … | + DrawCheck | ||
627 … | + DrawStub % But only if there is room | ||
628 … | + | ||
629 … | + stroke | ||
630 … | + 0 CheckHeight translate | ||
631 … | + } for | ||
632 … | + | ||
633 … | + showpage | ||
634 … | + /CheckNumber CheckNumber ChecksPerPage add def | ||
635 … | + /CurrentPage CurrentPage 1 add def | ||
636 … | + | ||
637 … | + } for | ||
638 … | + '; | ||
639 … | + | ||
640 … | +} |
Built with git-ssb-web