Coverage for pyilper/pilpdf.py: 99%

Shortcuts on this page

r m x   toggle line displays

j k   next/prev highlighted chunk

0   (zero) top of page

1   (one) first highlighted chunk

127 statements  

1#!/usr/bin/python3 

2# -*- coding: utf-8 -*- 

3# 

4# Dialogs for lif utilities operations 

5# (c) 2015 Joachim Siebold 

6# 

7# This program is free software; you can redistribute it and/or 

8# modify it under the terms of the GNU General Public License 

9# as published by the Free Software Foundation; either version 2 

10# of the License, or (at your option) any later version. 

11# 

12# This program is distributed in the hope that it will be useful, 

13# but WITHOUT ANY WARRANTY; without even the implied warranty of 

14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 

15# GNU General Public License for more details. 

16# 

17# You should have received a copy of the GNU General Public License 

18# along with this program; if not, write to the Free Software 

19# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 

20# 

21# pdf printer class ---------------------------------------------------- 

22# 

23# Changelog 

24# 21.08.2017 - jsi 

25# - first version 

26# 01.09.2017 - jsi 

27# - minor layout changes 

28# - added static method to obtain pdf output file name 

29# - added textItem class 

30# 01.11.2017 - jsi 

31# - update page number 

32# 01.03.2018 - jsi 

33# - use monospaced font defined in pilcore.py 

34# 

35from PySide6 import QtCore, QtGui, QtWidgets, QtPrintSupport 

36from .pilcore import * 

37 

38# 

39# PDF printer class: 

40# creates a PDF printer wich adds graphic items to a single or multi column 

41# output. 

42# 

43class cls_pdfprinter(QtCore.QObject): 

44 

45 def __init__(self,papersize, orientation, outputfilename, title, pagenumbering, columns): 

46 super().__init__() 

47 self.papersize= papersize 

48 self.orientation= orientation 

49 self.outputfilename= outputfilename 

50 self.title= title 

51 self.pagenumbering= pagenumbering 

52 self.columns= columns 

53# 

54# initialize printer and printer scene 

55# 

56 self.printer = QtPrintSupport.QPrinter (QtPrintSupport.QPrinter.HighResolution) 

57 if self.orientation== PDF_ORIENTATION_PORTRAIT: 

58 self.printer.setPageOrientation(QtGui.QPageLayout.Portrait) 

59 else: 

60 self.printer.setPageOrientation(QtGui.QPageLayout.Landscape) 

61 self.printer.setOutputFormat(QtPrintSupport.QPrinter.PdfFormat) 

62 self.pdfscene=QtWidgets.QGraphicsScene() 

63# 

64# page set up, we use 1/10 mm as scene units 

65# 

66 if self.papersize== PDF_FORMAT_A4: 

67 self.printer.setPageSize(QtGui.QPageSize.A4) 

68 self.scene_w= 2100 

69 self.scene_h=2970 

70 self.pdfscene.setSceneRect(0,0,self.scene_w,self.scene_h) 

71 else: 

72 self.printer.setPageSize(QtGui.QPageSize.Letter) 

73 self.scene_w= 2160 

74 self.scene_h= 2790 

75 self.pdfscene.setSceneRect(0,0,self.scene_w,self.scene_h) 

76 

77 self.pdfpainter = QtGui.QPainter() 

78 self.font=QtGui.QFont() 

79 self.font.setPointSize(20) 

80# 

81# set output filename 

82# 

83 self.printer.setOutputFileName(self.outputfilename) 

84# 

85# variables 

86# 

87 self.pdfitems=[] 

88 self.anzitems=0 

89 self.row=0 

90 self.column=0 

91 self.topy=0 

92 self.x=0 

93 self.y=0 

94 self.max_y= self.scene_h-PDF_MARGINS 

95 self.columnshift=(self.scene_w- 2* PDF_MARGINS)/ self.columns 

96# 

97# start printing 

98# 

99 def begin(self): 

100 self.pdfpainter.begin(self.printer) 

101 self.titleitem=QtWidgets.QGraphicsSimpleTextItem(self.title) 

102 self.titleitem.setFont(self.font) 

103 self.pdfscene.addItem(self.titleitem) 

104 self.titleitem.setPos(PDF_MARGINS,PDF_MARGINS) 

105 self.pageno=1 

106 if self.pagenumbering: 

107 self.pagenumberitem=QtWidgets.QGraphicsSimpleTextItem("Page "+str(self.pageno)) 

108 self.pagenumberitem.setFont(self.font) 

109 self.pdfscene.addItem(self.pagenumberitem) 

110 self.pagenumberitem.setPos(self.scene_w-self.pagenumberitem.boundingRect().width(),PDF_MARGINS) 

111# 

112# init variables 

113# 

114 self.pdfitems=[] 

115 self.anzitems=0 

116 self.row=0 

117 self.column=0 

118 self.top_y=PDF_MARGINS+self.titleitem.boundingRect().height()+40 

119 self.x= PDF_MARGINS 

120 self.y= self.top_y 

121 

122 def print_item(self,item): 

123# 

124# no more rows on page 

125# 

126 if self.y > self.max_y: 

127# 

128# no more columns, issue page break 

129# 

130 if self.column == self.columns-1: 

131 self.pdfscene.render(self.pdfpainter) 

132 self.printer.newPage() 

133 self.x=PDF_MARGINS 

134 self.y= self.top_y 

135 

136 for l in reversed(range(self.anzitems)): 

137 self.pdfscene.removeItem(self.pdfitems[l]) 

138 del self.pdfitems[-1] 

139 self.pageno+=1 

140 if self.pagenumbering: 

141 self.pagenumberitem.setText("Page "+str(self.pageno)) 

142 self.anzitems=0 

143 self.column=0 

144 self.row=0 

145# 

146# next column 

147# 

148 else: 

149 self.x+= self.columnshift 

150 self.y= self.top_y 

151 self.column+=1 

152 self.row=0 

153# 

154# add item to scene 

155# 

156 self.row+=1 

157 self.pdfscene.addItem(item) 

158 self.y+= item.boundingRect().height() 

159 item.setPos(self.x,self.y) 

160 self.anzitems+=1 

161 self.pdfitems.append(item) 

162# 

163# output remaining data and terminate printing 

164# 

165 def end(self): 

166 if self.anzitems > 0: 

167 self.pdfscene.render(self.pdfpainter) 

168 for l in reversed(range(self.anzitems)): 

169 self.pdfscene.removeItem(self.pdfitems[l]) 

170 del self.pdfitems[-1] 

171# 

172# clean up 

173# 

174 self.pdfscene.removeItem(self.titleitem) 

175 if self.pagenumbering: 

176 self.pdfscene.removeItem(self.pagenumberitem) 

177 self.pdfpainter.end() 

178 

179 

180# file name input dialogue for pdf print file 

181# 

182 @staticmethod 

183 def get_pdfFilename(): 

184 dialog=QtWidgets.QFileDialog() 

185 dialog.setWindowTitle("Enter PDF file name") 

186 dialog.setAcceptMode(QtWidgets.QFileDialog.AcceptSave) 

187 dialog.setFileMode(QtWidgets.QFileDialog.AnyFile) 

188 dialog.setDefaultSuffix("pdf") 

189 dialog.setNameFilters( ["PDF (*.pdf )", "All Files (*)"] ) 

190 dialog.setOptions(QtWidgets.QFileDialog.DontUseNativeDialog) 

191 if dialog.exec(): 

192 return dialog.selectedFiles() 

193# 

194# custom class for text item 

195# 

196class cls_textItem(QtWidgets.QGraphicsItem): 

197 

198 def __init__(self,text): 

199 super().__init__() 

200 self.text=text 

201# self.font= QtGui.QFontDatabase.systemFont(QtGui.QFontDatabase.FixedFont) 

202# self.font.setStyleHint(QtGui.QFont.TypeWriter) 

203 self.font= QtGui.QFont(FONT) 

204 self.font.setPointSize(2) 

205 metrics= QtGui.QFontMetrics(self.font) 

206 self.font_h= metrics.height() 

207 self.font_w= metrics.boundingRect("A").width() 

208 self.spacing=20 

209 self.h= self.font_h+self.spacing*2 

210 self.w= len(text)* self.font_w 

211 self.rect= QtCore.QRectF(0,0,self.w,self.h) 

212 

213 def setPos(self,x,y): 

214 super().setPos(x,y-self.h) 

215 

216 def boundingRect(self): 

217 return self.rect 

218 

219 def paint(self,painter,option,widget): 

220 posx=0 

221 posy=self.font_h 

222 painter.setFont(self.font) 

223 painter.drawText(posx,posy,self.text)