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
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
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 *
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):
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)
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
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
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()
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):
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)
213 def setPos(self,x,y):
214 super().setPos(x,y-self.h)
216 def boundingRect(self):
217 return self.rect
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)