freebsd-ports/chinese/bg5pdf/files/patch-gbpdf
Ying-Chieh Liao 6813118cff Add GB2312 Support
bump PORTREVISION

PR:		40194
Submitted by:	maintainer
2002-07-04 18:34:31 +00:00

302 lines
9.5 KiB
Text

--- 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()