--- gbpdf.orig Fri Jul 5 01:38:22 2002 +++ gbpdf Fri Jul 5 01:39:10 2002 @@ -0,0 +1,299 @@ +#!/usr/bin/env python + +""" +Bg5pdf is a simple wrapper for wrapping big5 encoding text file into +PDF file by using PDFlib. The output of this program does not contain +embedding fonts. You have to download Acrobat Acroread Asianfont pack +to view and print the output file. This wrapper does not provide any +formatting function except simple line wrapping. If you need +sophisticated formatting, you should try CJK-LaTex or other equivalent +tools. + +Information about PDFlib can be found at http://www.pdflib.com. +You might need it if you need to compile bg5pdflib module which +is used by gbpdf. + +You can download Acrobat Acroread Asianfont Pack at +http://www.adobe.com/products/acrobat/acrrasianfontpack.html + +============================================================================ + +Copyright (C) 2001 by Chen-Shan Chin +gbpdf ver. 1.0 Date:Jun 3 2001 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or any + later version. This program is distributed in the hope that it will + be useful, but WITHOUT ANY WARRANTY; without even implied warranty of + MERCHANTABILITY of FITTNESS + + FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Sofeware + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA + +""" + +import getopt +from string import * +from sys import * +from bg5pdflib import * +#If you want to use python binding (pdflib_py.so) coming with PDFlib, +#remark the above line and unmark the next line. +#from pdflib_py import * + + +False = 0 +True = 1 + +ASCII = 0 +GB2312 = 1 + + +def renderer(doc, fn): + p = PDF_new() + if PDF_open_file(p, fn) == -1: + print "Couldn't open PDF file '%s'\n" % fn + exit(2) + PDF_set_info(p, "Author", "gbpdf") + PDF_set_info(p, "Creator", "gbpdf") + PDF_set_info(p, "Title", "%s" % fn) + cfname = doc.fontName + cEncoding = doc.encoding + fontSize = doc.fontSize + topM = 792.0 / 11.0 + leftM = 792.0 / 11.0 + + PDF_begin_page(p, 612, 792) + font = PDF_findfont(p, cfname, cEncoding, 0) + PDF_setfont(p, font, fontSize) + mode = GB2312 + y = 0 + pageN = 1 + for l in doc.parsedLines: + if len(l) == 0: + y = y + fontSize + continue + x = 0.0 + PDF_set_text_pos(p, leftM + x, 792 - topM -y) + curStr = "" + for pos in range(len(l)): + ch = l[pos] + if ch[0] != mode: + if len(curStr) != 0: + if mode == GB2312: + font = PDF_findfont(p, cfname, cEncoding, 0) + PDF_setfont(p, font, fontSize) + PDF_show(p, curStr) + else: + font = PDF_findfont(p, "Courier", "host", 0) + PDF_setfont(p, font, fontSize) + PDF_show(p, curStr) + mode = ch[0] + curStr = ch[1] + else: + curStr = curStr + ch[1] + + if len(curStr) != 0: + if mode == 1: + font = PDF_findfont(p, cfname, cEncoding, 0) + PDF_setfont(p, font, fontSize) + PDF_show(p, curStr) + else: + font = PDF_findfont(p, "Courier", "host", 0) + PDF_setfont(p, font, fontSize) + PDF_show(p, curStr) + + y = y + fontSize + doc.lineSpacing + if y > 792 - 2* topM: + font = PDF_findfont(p, "Helvetica-Oblique", "host", 0) + PDF_setfont(p, font, 12) + PDF_show_xy(p,"Converted to PDF by gbpdf", 400, 750) + PDF_show_xy(p,"file name: %s--Page %d" % (doc.infileName, pageN), 60,750) + PDF_setlinewidth(p,2) + PDF_moveto(p, 50, 740) + PDF_lineto(p, 562, 740) + PDF_stroke(p) + PDF_end_page(p) + pageN = pageN + 1 + PDF_begin_page(p, 612, 792) + font = PDF_findfont(p, cfname, cEncoding, 0) + PDF_setfont(p, font, fontSize) + mode = GB2312 + y = 0 + font = PDF_findfont(p, "Helvetica-Oblique", "host", 0) + PDF_setfont(p, font, 12) + PDF_show_xy(p,"Converted to PDF by gbpdf", 400, 750); + PDF_show_xy(p,"file name: %s--Page %d" % (doc.infileName, pageN), 60,750) + PDF_setlinewidth(p,2) + PDF_moveto(p, 50, 740) + PDF_lineto(p, 562, 740) + PDF_stroke(p) + PDF_end_page(p) + PDF_close(p) + PDF_delete(p) + +class document: + infileName = "" + fontSize = 12; + fontNames = ["STSong-Light"] + fontName = fontNames[0] + encodings = ["GBK-EUC-H"] + encoding = encodings[0] + wrapped = False + numOfChr = 55 #number of character per line for wrapping text + parsedLines=[] + lineSpacing = 2 + + def getChr(self, st, i): + if i + 1 < len(st) and\ + (ord(st[i]) >= 161 and ord(st[i]) <= 249) and \ + ((ord(st[i+1]) >=64 and ord(st[i+1]) <=126) or \ + (ord(st[i+1]) >=161 and ord(st[i+1]) <=254)) : # bg5_c + cnchr = st[i:i+2] + return (cnchr, 2) + else: + cnchr = st[i] + return (cnchr, 1) + + def setFontSize(self, fs): + self.fontSize = fs + + def setFont(self, fn): + if not fn in self.fontNames: + raise FontError + else: + self.fontName = fn + + def setWrapped(self, yn, nc): + if yn > 0: + self.wrapped = True + self.numOfChr = nc + + def setLineSpacing(self, ls): + self.lineSpacing = ls + + def setFontSize(self, fs): + self.fontSize = fs + + def parseFile(self, filename): + self.infileName = filename + try: + f = open(filename,"r"); + except IOError: + print 'can not open file: "%s"' % filename + exit(2) + for line in f.readlines(): + line = rstrip(line) + #if line[-1] == '\n': + # line = line[:-1] + if len(line) == 0: + self.parsedLines.append([]) + continue + pline = [] + pos = 0 + cpos = 0 + line_len = len(line) + while 1: + (chrx, inc) = self.getChr(line, pos) + pos = pos + inc + cpos = cpos + inc + if inc == 2: + pline.append([GB2312, chrx]) + else: + pline.append([ASCII, chrx]) + if pos >= line_len: + break + if (self.wrapped == True) and ((cpos + 2) >= self.numOfChr): + cpos = 0 + self.parsedLines.append(pline) + pline = [] + self.parsedLines.append(pline) + +def usage(): + print "usage: gbpdf [option] inputfile outfile" + print "d: integer, s:string" + print "-w d, --wrap=d: wrapping line up to d ASCII characters (Each GB2312 character" + print " occupis two ASCII character spaces.)" + print "-s d, --size=d: set the size of font (default: 11)" + print "-f s, --font=s: set font (default: 'Msung-Light')" + print "-l d, --linespacing=d: set spacing between line (default:2)" + print "--inputfile=s: input file name" + print "--outputfile=s: outfile name (default: inputfile.pdf)" + print "--showfonts: show avaiable fonts" + +getopt.GetoptError = getopt.error + +def main(): + try: + opts, args =\ + getopt.getopt(argv[1:], + "w:s:f:l:", + ["size=", + "font=", + "linespacing=", + "inputfile=", + "outputfile=", + "wrap=", + "showfonts"]) + except getopt.error: + usage() + exit(2) + + #print opts, args + + doc = document() + doc.setFont(doc.fontNames[0]) + doc.setWrapped(False, 0) + doc.setLineSpacing(2) + doc.setFontSize(11) + + infile = "" + outfile = "" + + for opt in opts: + if opt[0] == "--size" or opt[0] == "-s": + doc.setFontSize(atof(opt[1])) + continue + if opt[0] == "--font" or opt[0] == "-f": + doc.setFont(opt[1]) + continue + if opt[0] == "--wrap" or opt[0] == "-w": + doc.setWrapped(True, atoi(opt[1])) + continue + if opt[0] == "--linespacing" or opt[0] == "-l": + doc.setLineSpacing(atof(opt[1])) + if opt[0] == "--inputfile": + infile = opt[1] + continue + if opt[0] == "--outfile": + outfile = opt[1] + continue + if opt[0] == "--showfonts": + print "Avaiable Fonts:" + for f in doc.fontNames: + print f + exit(2) + + if len(args) == 2: + infile = args[0] + outfile = args[1] + elif len(args) == 1: + infile = args[0] + + if infile == "": + print "no input file name" + exit(2) + + if outfile == "": + outfile = infile+".pdf" + + doc.parseFile(infile) + renderer(doc,outfile) + print "Output File is %s" % outfile + +if __name__ == "__main__": + main()