---
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
เป็นตัวขึ้นบรรทัดใหม่ได้เลย
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 ยังไงกันแน่
top Left | 20 | 30 | |
12 | |||
02 | 12 | 22 | 32 |
03 | 13 | 23 | |
04 | 14 |
file | function | description |
---|---|---|
report_tags | school.templatetags.report_tags | |
shift_display | แปลงค่า
| |
coarse_grade_display | แสดงชั้นปีแบบคร่าวๆ โดยจะใช้ค่าชั้นปีแบบใดก็ได้ ผลเป็นแบบหยาบเสมอ โดยจะแสดงเป็น
| |
fine_grade_display | แสดงชั้นปีแบบเจาะจงชั้นปี โดยจะแสดงเป็น
| |
course_display | แสดงหลักสูตรของสายวิชาชีพของแต่ละห้อง | |
education_level_display | แสดงวุฒิที่ได้รับการบรรจุของบุคลากร เช่น ป.เอก (ครู) ป.เอก | |
extra_tags | core.templatetags.extra_tags | |
intcomma2 | เติม , ให้กับหลักพัน และถ้าค่าเป็นทศนิยมก็จะตัดเหลือแค่ 2 หลักให้อัตโนมัติ | |
intword_th | แสดงจำนวนเงินเป็นภาษาไทย | |
date_abbv_th | 11 พ.ย. 2556 | |
date_full_th | 5 ธันวาคม 2556 | |
month_abbv_th | ม.ค. 2556 | |
month_full_th | กุมภาพันธ์ 2556 | |
year_th | 2556 | |
system_status_display |