Найти - Пользователи
Полная версия: wxPython & Печать документов
Начало » GUI » wxPython & Печать документов
1 2 3 4
vak
Подскажите как (на чем) лучше всего решить задачу печати документов для wxPython. Например счет или Торг12. Естественно требуются шаблоны документов с “шапкой”, табличной частью и пр. с возможностью простого сопровождения: т.е. легко шаблон изменить либо создать дополнительную форму документа. На мой взгляд встроенные возможности wxPython тут не подходят. Что может подойти? Как люди сейчас решают подобные задачи?
OlDer
Я использую http://reportman.sourceforge.net/
Для python есть модуль тут: http://tech.groups.yahoo.com/group/reportman/files/ но нужно быть участником этой группы и залогиниться. Попытался прикрепить этот файл здесь - не получилось…

Еще люди используют reportlab или http://pythonreports.sourceforge.net/
proDiva
Я для разных целей использую разные модули.
Если нужно печатать сплошной текст, я формирую обычный текстовый файл, а в wxPython есть предпросмотр и печать текстовых файлов.
Если нужно что-то крупнее с таблицей, то делаю html-файл, в wxPython есть возможность предпросмотра и печати и этого вида файлов.
Если же таблица очень сложна для html, то формирую xls-файл с помощью модуля pyExcelerator и открываю для печати уже во внешнем Excel или OpenOffice.
Если что-то из этих вариантов интересует, могу выложить примеры.
vak
proDiva
Я для разных целей использую разные модули.
Если нужно печатать сплошной текст, я формирую обычный текстовый файл, а в wxPython есть предпросмотр и печать текстовых файлов.
Если нужно что-то крупнее с таблицей, то делаю html-файл, в wxPython есть возможность предпросмотра и печати и этого вида файлов.
Если же таблица очень сложна для html, то формирую xls-файл с помощью модуля pyExcelerator и открываю для печати уже во внешнем Excel или OpenOffice.
Если что-то из этих вариантов интересует, могу выложить примеры.
Да, интересно бы посмотреть примеры, интерес представляют все три варианта. Сам недавно пробовал плоский файл через wxPython печатать - кое что не получилось.
vak
OlDer
Я использую http://reportman.sourceforge.net/
Для python есть модуль тут: http://tech.groups.yahoo.com/group/reportman/files/ но нужно быть участником этой группы и залогиниться. Попытался прикрепить этот файл здесь - не получилось…

Еще люди используют reportlab или http://pythonreports.sourceforge.net/
Да, смотрел документацию по reportlab - впечатляют возможности. Кроме того вроде TinyERP использует reportlab?
proDiva
На работе была запарка, сейчас готовлю примеры всех способов. Подождите немного.
proDiva
Вот пример печати в формате html:

# -*- coding: cp1251 -*-

from wxPython.wx import *
from wxPython.grid import *
import wx.grid
import wx
import string
import datetime
import os
import wx.html as html
import wx.lib.wxpTag

if wx.Platform == ‘__WXMSW__’:
import wx.lib.iewin as iewin

html_file = ‘test.html’

class MyFrameHtml(wx.Frame):
def __init__(self, parent, title):
wx.Frame.__init__(self, parent, -1, title,
size=(400, 300))
wind = wxSplitterWindow(self, -1)
pan1 = wxScrolledWindow(wind, -1)
pan1.SetScrollRate(10, 10)
pan2 = wxPanel(wind, -1)
wind.SetMinSize((400,300))
pan1.SetMinSize((400,270))
pan2.SetMinSize((400,30))
Font = wx.Font(10, wx.SWISS, wx.NORMAL, wx.BOLD)
wind.SplitHorizontally(pan1, pan2)
sizer_1 = wx.BoxSizer(wx.VERTICAL)
sizer_2 = wx.BoxSizer(wx.HORIZONTAL)

self.html = html.HtmlWindow(pan1, -1, style = wx.NO_FULL_REPAINT_ON_RESIZE)
self.html.SetMinSize((400,300))

self.printer = html.HtmlEasyPrinting()
self.current = “”

self.btn1 = wx.Button(pan2, -1, “Печать”)
self.btn1.SetFont(Font)
self.btn2 = wx.Button(pan2, -1, “Закрыть”)
self.btn2.SetFont(Font)

EVT_BUTTON(self, self.btn1.GetId(), self.on_print)
EVT_BUTTON(self, self.btn2.GetId(), self.on_close)

pan1.SetSizer(sizer_1)
pan2.SetSizer(sizer_2)

sizer_1.Add(self.html, 0, wx.EXPAND)
sizer_2.Add(self.btn1, -1, wx.EXPAND)
sizer_2.Add(self.btn2, -1, wx.EXPAND)

def on_print(self, evt):
self.printer.GetPrintData().SetPaperId(wx.PAPER_LETTER)
self.printer.PrintFile(self.html.GetOpenedPage())
evt.Skip()

def on_close(self, evt):
self.Destroy()
evt.Skip()

class MyHTML:
def __init__(self):

self.one =
self.two =

def Form(self):
path = os.path.normpath(html_file)
in_file=open(path, ‘w’)
stroka = ‘'
shapka = ’'
konec = ‘'
shapka = ’''
<html>
<head>
<meta http-equiv=“Content-Language” content=“ru”>
<meta http-equiv=“Content-Type” content=“text/html; charset=windows-1251”>
</head>
<body>
<p align=“center”><b>ПРИМЕР ПЕЧАТИ</b>
<table border=“1” width=“100%”>
<tr>
<td width=“50%” align=“center”>Колонка</td>
<td width=“50%” align=“center”>Колонка</td>
</tr>'''
for i in range(len(self.one)):
stroka = stroka + ‘'’
<tr>
<td width=“50%” align=“center”>'''+self.one+'''</td>
<td width=“50%” align=“center”>'''+self.two+'''</td>
</tr>'''
konec = ‘'’
</table>
</body>
</html>'''
text = shapka + stroka + konec
in_file.write(text)
in_file.close()
return

class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
kwds = wxDEFAULT_FRAME_STYLE
wxFrame.__init__(self, *args, **kwds)

self.SetSize((400, 300))
font_1 = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD)

self.window1 = wxSplitterWindow(self, -1, style=wxNO_BORDER)
self.panel1 = wxPanel(self.window1, -1)
self.panel2 = wxPanel(self.window1, -1)

self.prt = wxButton(self.panel2, -1, _(“Печать”))
self.prt.SetFont(font_1)
self.exit = wxButton(self.panel2, -1, _(“Выход”))
self.exit.SetFont(font_1)

self.grid1 = wxGrid(self.panel1, -1, size=(1, 1))
self.grid1.CreateGrid(100, 2)
self.grid1.SetRowLabelSize(40)
self.grid1.SetMinSize((550,450))

self.grid1.SetColLabelValue(0, _(“One”))
self.grid1.SetColSize(0,150)
self.grid1.SetColLabelValue(1, _(“Two”))
self.grid1.SetColSize(1,150)

EVT_BUTTON(self, self.prt.GetId(), self.on_print)
EVT_BUTTON(self, self.exit.GetId(), self.on_exit)

self.panel1.SetMinSize((550, 470))
self.panel2.SetMinSize((550, 30))
self.window1.SetMinSize((550, 500))

sizer = wxBoxSizer(wxVERTICAL)
sizer_1 = wxBoxSizer(wxVERTICAL)
sizer_2 = wxBoxSizer(wxHORIZONTAL)


sizer_2.AddMany([(self.prt, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0),
(self.exit, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)])

sizer_1.AddMany([(5,5),
(self.grid1, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0),
(5,5)])

self.panel1.SetSizer(sizer_1)
self.panel2.SetSizer(sizer_2)
self.window1.SplitHorizontally(self.panel1, self.panel2)
sizer.Add(self.window1, 1, wxALL|wxEXPAND, 0)
self.SetAutoLayout(True)
self.SetSizer(sizer)
self.Layout()
self.Centre()

def on_exit(self, event):
self.Destroy()
event.Skip()

def on_print(self, event):
html = MyFrameHtml(None, ‘Печать’)
my = MyHTML()
tbl = self.grid1.GetTable()
for i in range(tbl.GetNumberRows()):
if tbl.GetValue(i, 0) != '':
my.one.append(str(tbl.GetValue(i,0)))
my.two.append(str(tbl.GetValue(i,1)))
else:
break

my.Form()
html.current = html_file
html.html.LoadPage(html.current)
html.Show()
event.Skip()

class MyApp(wx.App):
def OnInit(self):
wxInitAllImageHandlers()
frame = MyFrame(None, -1, “Пример”)
self.SetTopWindow(frame)
frame.Show()
return 1

if __name__ == “__main__”:
import gettext
gettext.install(“app”)

app = MyApp(redirect=True)
app.MainLoop()
proDiva
Вот пример с использованием формата xls:

# -*- coding: cp1251 -*-

from wxPython.wx import *
from wxPython.grid import *
import wx.grid
import wx
import string
import os
from pyExcelerator import *

class MyFrame(wx.Frame):
def __init__(self, *args, **kwds):
kwds = wxDEFAULT_FRAME_STYLE
wxFrame.__init__(self, *args, **kwds)

self.SetSize((400, 300))
font_1 = wx.Font(10, wx.DEFAULT, wx.NORMAL, wx.BOLD)

self.window1 = wxSplitterWindow(self, -1, style=wxNO_BORDER)
self.panel1 = wxPanel(self.window1, -1)
self.panel2 = wxPanel(self.window1, -1)

self.prt = wxButton(self.panel2, -1, _(“Печать”))
self.prt.SetFont(font_1)
self.exit = wxButton(self.panel2, -1, _(“Выход”))
self.exit.SetFont(font_1)

self.grid1 = wxGrid(self.panel1, -1, size=(1, 1))
self.grid1.CreateGrid(100, 2)
self.grid1.SetRowLabelSize(40)
self.grid1.SetMinSize((550,450))

self.grid1.SetColLabelValue(0, _(“One”))
self.grid1.SetColSize(0,150)
self.grid1.SetColLabelValue(1, _(“Two”))
self.grid1.SetColSize(1,150)

EVT_BUTTON(self, self.prt.GetId(), self.on_print)
EVT_BUTTON(self, self.exit.GetId(), self.on_exit)

self.panel1.SetMinSize((550, 470))
self.panel2.SetMinSize((550, 30))
self.window1.SetMinSize((550, 500))

sizer = wxBoxSizer(wxVERTICAL)
sizer_1 = wxBoxSizer(wxVERTICAL)
sizer_2 = wxBoxSizer(wxHORIZONTAL)


sizer_2.AddMany([(self.prt, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0),
(self.exit, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0)])

sizer_1.AddMany([(5,5),
(self.grid1, -1, wx.EXPAND|wx.ADJUST_MINSIZE, 0),
(5,5)])

self.panel1.SetSizer(sizer_1)
self.panel2.SetSizer(sizer_2)
self.window1.SplitHorizontally(self.panel1, self.panel2)
sizer.Add(self.window1, 1, wxALL|wxEXPAND, 0)
self.SetAutoLayout(True)
self.SetSizer(sizer)
self.Layout()
self.Centre()

def on_exit(self, event):
self.Destroy()
event.Skip()

def on_print(self, event):
tb = self.grid1.GetTable()

w = Workbook()
ws = w.add_sheet('test')

fnt1 = Font() # главный заголовок
fnt1.name = ‘Roman’
fnt1.height = 240

fnt2 = Font() # основной текст
fnt2.name = ‘Roman’
fnt2.height = 200

fnt3 = Font() # основной жирный
fnt3.name = ‘Roman’
fnt3.height = 200
fnt3.bold = True

fnt4 = Font() # маленький
fnt4.name = ‘Roman’
fnt4.height = 160

bor1 = Borders() # подчеркивание
bor1.bottom = 1

bor2 = Borders() # рамка
bor2.bottom = 1
bor2.top = 1
bor2.left = 1
bor2.right = 1

al1 = Alignment() # по центру с переносом слов
al1.horz = Alignment.HORZ_CENTER
al1.vert = Alignment.VERT_TOP
al1.wrap = True

al2 = Alignment()
al2.horz = Alignment.HORZ_JUSTIFIED
al2.vert = Alignment.VERT_TOP

style1 = XFStyle() # заголовок
style1.font = fnt1
style1.alignment = al1

style2 = XFStyle() # основной текст без рамок
style2.font = fnt2

style3 = XFStyle() # основной текст с подчеркиванием
style3.font = fnt2
style3.borders = bor1
style3.alignment = al1

style4 = XFStyle() # основной жирный с подчеркиванием
style4.font = fnt3
style4.alignment = al1
style4.borders = bor1

style5 = XFStyle() # заголовок в рамке
style5.font = fnt3
style5.alignment = al1
style5.borders = bor2

style6 = XFStyle() # основной текст в рамке с переносом слов
style6.font = fnt2
style6.alignment = al2
style6.borders = bor2

style7 = XFStyle() # основной маленький текст без рамок
style7.font = fnt4
style7.alignment = al1

ws.write_merge(0, 0, 0, 4, ‘Лучший форум по питону на Python.com.ua!’, style1)
for i in range(tb.GetNumberRows()):
if tb.GetValue(i, 0) != ‘':
ws.write(1+i, 0, tb.GetValue(i, 0), style3)
ws.write(1+i, 1, tb.GetValue(i, 1), style4)
else:
break

for j in range(0, 4):
ws.col(j).width = 3000

#ws.portrait = False
ws.header_str = ’'
ws.footer_str = ‘'
w.save(’test.xls')

path = os.path.normpath('test.xls')
os.startfile(path)
event.Skip()

class MyApp(wx.App):
def OnInit(self):
wxInitAllImageHandlers()
frame = MyFrame(None, -1, “Пример”)
self.SetTopWindow(frame)
frame.Show()
return 1

if __name__ == “__main__”:
import gettext
gettext.install(“app”)

app = MyApp(redirect=True)
app.MainLoop()
vak
Ок, спасибо. Буду смотреть - может вопросы возникнут.
А печать сплошного текста? есть пример?
proDiva
vak
А печать сплошного текста? есть пример?
Был хороший пример….. удалила, теперь нужно снова сочинять))
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB