You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

183 lines
18 KiB

---
layout: post
type: handbook
title: "ReportLab 101"
date: 2013-10-29
tags: coding pdf reportlab
---
## Style
เราจะใชเพยงแค font TH Sarabun New ครบ โดยจะมใหเลอกแค 2 แบบ:-
* TH Sarabun New
* TH Sarabun New Bold
วนแตละสวนนน สามารถจดการ style โดยการออกแบบ Style ของแตละสวนกอน เชน ใหวกระดาษเปนอยางนง, เนอหาอยางนง, ในตารางอกแบบนง, คำอธบายใตตารางอกแบบนง เปนตน พยายามจดการใหนไมองมแบบมาก เพราะ (1)งายตอการอาน code (2)งายตอตอการแกไข (3)ไมมเฟอย
เทาทายทดคอ ใช `ParagraphStyle` โดยเราสามารถจดการไดโดย `import ParagraphStyle`านบนของ file กอน
from core.views.pdfs import Paragraph, ParagraphStyle
จากนนเรากจะสามารถกำหนด style ของตวเองได
style_x1 = ParagraphStyle(name="style_name",
fontName='TH Sarabun New',
fontSize=16,
alignment=TA_CENTER,
leading=16,
spaceAfter=8,)
`name="xxx"` เปนสงทจำเปนสำหร`ParagraphStyle` นอกนนกกำหนดตามตองการ ตรง `TA_CENTER` แปลวา ใหนอยตรงกลาง ซงกงม `TA_LEFT`, `TA_RIGHT`, `TA_JUSTIFY` ตามชอ โดยถาตองการใชาพวกนอง import ดวย เช
from reportlab.lib.enums import TA_CENTER, TA_LEFT
านมาคอ การตงวา style เราจะมอะไรบางตอไปกจะเปนการใช style หลกๆแลวเราจะใช Python List (กอารมณ array นนแหละ) ในการเกบขอมลแตละชดๆไป จะอารมณประมาณว
lines = [] # เรม declare list กอน
lines.append(Paragraph("บรรทดแรก", style_x1)) # อนนเหมอนเพม element ใน list
lines.append(Paragraph("บรรทดทสอง", style_x1)) # อนนเหมอนเพม element ใน list ตอไป
เรากจะไดประมาณว
บรรทดแรก
บรรทดทสอง
นจะตรงกลางนะ แตมในนลำบาก กเลยทำเปนเปนแควอยาง
### Color
การกำหนดสจากทใช `colors.lightgrey` อะไรไปกงสามารถกำหนดสเองไดโดย
from reportlab.lib.colors import Color
red50transparent = Color(100, 0, 0, alpha=0.5)
โดย `Color(สแดง, สเขยว, สา, alpha=1)` โดยแตละสาตงแต 0-255 และ alpha กาตงแต 0-1 (1 คอ ทบ, 0 คอ ใสทะลปรโปรง) จากนนกเอา `red50transparent` ไปแทนท `colors.lightgrey` ไดเลย
### ขอสงเกต
1. การขนบรรทดใหมาเปน Paragraph เดยวกนมนจะตดขนบรรทดใหมใหเอง โดยใชองวางเปนตวตด มนใชไดบภาษาองกฤษ แตไมใชภาษาไทย ดงนนเราตองตดคำเองครบ ถาคดวาตวอกษรมนมจำนวนไมแนนอน เผอไวเลยครบ ดกวากลายเปนฉกคำประหลาดๆ ใหานหลงวางไวเยอะหนอยยงดกวามาก
1. การขนบรรทดใหม สามารถใช html tag <br/> เปนตวขนบรรทดใหมไดเลย
1. แตละ Paragraph จะขนบรรทดใหมเสมอ คามนจะขนกบ spaceBefore กบ spaceAfter
## Table
ตารางเปนอกสวนทความซบซอนพอสมควรในกรณ cell รวมกน แตาตามปกตายๆ ไมอะไร มาดวอยางงายๆ แลวคอยไลอธบายบางทอาจจะเขาใจงายกว
data = [
['top\nLeft', '10', '20', '30'],
['01', '11', '21'],
['02', '12', '22', '32'],
['03', '13', '23', '33'],
['04', '14', '24', '34'],
]
t = Table(data, style=[
('FONTNAME', (0,0), (-1,-1), 'TH Sarabun New Bold'),
('GRID', (0,0), (-1,-1), 0.5 , colors.grey),
('BACKGROUND',(0,0),(1,1),colors.palegreen),
('SPAN',(0,0),(1,1)),
('BACKGROUND',(-2,-2),(-1,-1), colors.red),
('SPAN',(-2,-2),(-1,-1)),
])
lines.append(t)
data นนจะเปนตวเกบขอมลไวแสดงในตารางโดยจะเปน list 2 หรอ 3 ม เรยกไมกเหมอนกน แตนจะซอนกนอยางนน โดยระดบแรกจะเปนตวขอมลแสดงของ row และระดบท 2 กอจะเปนตวขอมลในระดบ column ของแตละ row โดยขอมลนนจะใช `Table` เปนตวแปลงใหเปนตาราง (ซงกอง import อกนนแหละ)
from core.views.pdfs import Table
หลงจากนนกองไปตอใน lines เหมอนกบททำกบ Paragraph ไมดครบ ความสบสนของตารางมนจะอยตรงท style มากกวา มาดผลโดยประมาณกนกอนวา มนจะได ตารางใน pdf ยงไงกนแน
<table class="wikitable"><tbody><tr><td style="background-color: #33dd33;" colspan="2" rowspan="2">top<p>Left</p></td><td>20</td><td>30</td></tr><tr><td>12</td><td></td></tr><tr><td>02</td><td>12</td><td>22</td><td>32</td></tr><tr><td>03</td><td>13</td><td style="background-color: #f66;" colspan="2" rowspan="2">23</td></tr><tr><td>04</td><td>14</td></tr></tbody></table>
ตารางจะเรมทมบนซาย -- เรมดวย column 0 และ row 0 --> (0, 0) ตามทเหนกวๆนะครบ ขเกยจครบ อยางทเหนชดๆ คอ จะม cell merge กนอย 2 ท
1.มซายบน ตำแหน`(col, row) (0, 0)``(1, 1)`
1.มขวาลาง ตำแหน`(col, row) (2, 3)``(3, 4)` หรอมองอกมม (ขวาลาง) ค`(-2,-2),(-1,-1)`
จรงๆ กจะเหนชดเจนกวา style มนเนย ตรงท cell merge กน ถกกำหนดดวย
('BACKGROUND',(0,0),(1,1),colors.palegreen),
('SPAN',(0,0),(1,1)),
`BACKGROUND`ไมไดเกยวอะไรกบเคา เพยงแคบอกสครบ SPAN เปนตวบอกวา เราจะรวม cell ไหนถงตรงไหนกนแน โดยขอมลจะเปนขอมลของ cell แรกเสมอคร
### จดตำแหน
าตองการจะจดตำแหนงอกษรของแตละ cell กเพมใน style ของ Table ได
('ALIGN',(0,0),(0,0),'CENTER'),
('VALIGN',(0,0),(0,0),'MIDDLE'),
* `ALIGN`อ จดตำแหนงแนวนอน มาเป`LEFT`, `RIGHT`, `CENTER` -- คา default เป`LEFT`
* `VALIGN`อ จดตำแหนงแนวนอน มาเป`TOP`, `MIDDLE`, `BOTTOM` -- คา default เป`BOTTOM`
ในกรณองการจดการตำแหนงของ cell ทการรวม cell กำหนดตำแหนงแค cell ทอมล (มมขวาบน) กพอ
### ขอสงเกต
1. `SPAN` สามารถกำหนด ตำแหนงคาตดลบได `('SPAN',(-2,-2),(-1,-1))` << โดยจะเปนการคดจากมมขวาลางมา ตรงขามกบคาบวกทดจากมมซายบน
1. `SPAN` จะไมสนใจขอมลทอยในตำแหนงอนเลย นอกจากตวมมบนขวาของทรวม -- ตวอนจะอารมณกทบไปเลย โดยสงเกตไดจากตวอยาง row ท 2 กลายเปนวา 01, 11 หายไปเลย โดยตำแหนง 21 กไมไดเปลยนไป
1.า list มไมครบในตาราง ตรงทขาดไปกจะเปนชองวาง
1. การขนบรรทดใหมในตารางใช escape key `\n` ไมใช `<br/>` เหมอนใน `Paragraph`
1. พวก `SPAN` ใน style ไมไดองเรยงลำดบอะไรครบ จดยงไงกไดนอานรเรอง แตควรจะทำใหนเปนจากบนลงลาง เปนระบบหนอยกเพราะแคเราจะกลบไปแกลำบากขนเยอะ ถามนไลไมไดายๆคร
เทานาจะพอได idea ไปลองแลวหล
## การแกใน .py
ใครใชรายงานไหน จรงๆ กาจะมอะไรอยใน file พอสมควรแลวครบ แตวนทองแกอ สวนของ
def prep_to_pdf(self, context):
lines = []
......
.....
...
..
return render_to_pdf(lines)
แควนจดๆๆ นแหละครบ ทองแกไข (ซงชอตวแปร lines กเปลยนไดตามชอบใจครบ ทใช lines เพราะจะไดสอดคลองกบตวอยางดานบน)
### การใชคำสงตางๆ
โดยมากแลวจะเปนการเปรยบเทยบคำสงตางๆ ของ templatetag ทเหนใน .html กบทองเขยนใน python (.py) ใน html นนจะมการเรยกใชงานตวแปรและ function ทางออกไปจากปกต
{{date}}
`{{ }}` ไวสำหรบแสดงผลตวแปรนนเปน string
{{date|month_full_th}}
| เปนการบงบอกวา มการใช function กบตวแปร date โดยเราจะสามารถดไดา function นออะไรไดจากการ import function ขางบน ซงใน `templatetag` จะใชคำส`{ % load yyyyy % }`
การใชงาน function พวกนใน python code นนจะสามารถทำไดโดย
from core.templatetags.extratags import intcomma2, intword_th, month_full_th
thb = 1423.223
print u'ราคา %s' % intcomma2(thb)
# จะไดผลลพธเป
ราคา 1,423.22
### คำสงอางอ
templatetags ทใชใน .html กแตกตางกนออกไปแตหลกๆกจะมอย 2 ทวยกนค
* `report_tags` -- สวนใหญจะเปนการแปลงคาแสดงผลทเกยวกบโรงเรยนทงหมด เชน แสดงรอบ แสดงชนเปนต
from school.templatetags.report_tags import *
* `extra_tags` -- เปนการแปลงคาเพอแสดงผลทวๆไป เชน ใน , ในหลกพน การพมวนทเปนภาษาไทย หรอพมจำนวนเงนเปนภาษาไทย
from core.templatetags.extra_tags import *
รายละเอยดของคำสงมงน
<table class="wikitable"><tbody><tr><th> file</th><th> function</th><th> description</th></tr><tr><td style="background-color: #ffffcc;" rowspan="6">report_tags</td><td style="background-color: #ffffcc;" colspan="2"> school.templatetags.report_tags</td></tr><tr><td> shift_display</td><td> แปลงค<ul><li> 0 -&gt; รอบเชา และ</li><li> 1 -&gt; รอบบาย</li></ul></td></tr><tr><td> coarse_grade_display</td><td> แสดงชนปแบบคราวๆ โดยจะใชาชนปแบบใดกได ผลเปนแบบหยาบเสมอ โดยจะแสดงเป<ul><li> เตรยมอนบาล</li><li> อนบาล</li><li> ประถมศกษา</li><li>ธยมศกษาตอนต</li><li>ธยมศกษาตอนปลาย</li><li> ประกาศนยบตรวชาช</li><li> ปวส.</li><li> ปวท.</li></ul></td></tr><tr><td> fine_grade_display</td><td> แสดงชนปแบบเจาะจงชนป<p>โดยจะแสดงเป</p><ul><li> เตรยมอนบาล</li><li> อ.1, อ.2, อ.3</li><li> ป.1, ป.2, ป.3, ป.4, ป.5, ป.6, </li><li> ม.1, ม.2, ม.3, ม.4, ม.5, ม.6, </li><li> ปวช.1-3</li><li> ปวส.1-3</li><li> ปวท.1-2</li></ul></td></tr><tr><td> course_display</td><td> แสดงหลกสตรของสายวชาชพของแตละหอง</td></tr><tr><td> education_level_display</td><td> แสดงวไดบการบรรจของบคลากร เชน ป.เอก (คร) ป.เอก</td></tr><tr><td style="background-color: #ffffcc;" rowspan="9"> extra_tags</td><td style="background-color: #ffffcc;" colspan="2"> core.templatetags.extra_tags</td></tr><tr><td> intcomma2</td><td> เตม , ใหบหลกพน และถาคาเปนทศนยมกจะตดเหลอแค 2 หลกใหตโนม</td></tr><tr><td> intword_th</td><td> แสดงจำนวนเงนเปนภาษาไทย</td></tr><tr><td> date_abbv_th</td><td> 11 พ.ย. 2556</td></tr><tr><td> date_full_th</td><td> 5 ธนวาคม 2556</td></tr><tr><td> month_abbv_th</td><td> ม.ค. 2556</td></tr><tr><td> month_full_th</td><td>มภาพนธ 2556</td></tr><tr><td> year_th</td><td> 2556</td></tr><tr><td> system_status_display</td><td></td></tr></tbody></table>