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.
 
 
 

18 KiB

layout type title date tags
post handbook ReportLab 101 2013-10-29 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 เดยวกนมนจะตดขนบรรทดใหมใหเอง โดยใชองวางเปนตวตด มนใชไดบภาษาองกฤษ แตไมใชภาษาไทย ดงนนเราตองตดคำเองครบ ถาคดวาตวอกษรมนมจำนวนไมแนนอน เผอไวเลยครบ ดกวากลายเปนฉกคำประหลาดๆ ใหานหลงวางไวเยอะหนอยยงดกวามาก
  2. การขนบรรทดใหม สามารถใช html tag
    เปนตวขนบรรทดใหมไดเลย
  3. แตละ 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

2030
12
02122232
031323
0414

ตารางจะเรมทมบนซาย -- เรมดวย column 0 และ row 0 --> (0, 0) ตามทเหนกวๆนะครบ ขเกยจครบ อยางทเหนชดๆ คอ จะม cell merge กนอย 2 ท

  1. มซายบน ตำแหน(col, row) (0, 0)(1, 1)
  2. มขวาลาง ตำแหน(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)) << โดยจะเปนการคดจากมมขวาลางมา ตรงขามกบคาบวกทดจากมมซายบน
  2. SPAN จะไมสนใจขอมลทอยในตำแหนงอนเลย นอกจากตวมมบนขวาของทรวม -- ตวอนจะอารมณกทบไปเลย โดยสงเกตไดจากตวอยาง row ท 2 กลายเปนวา 01, 11 หายไปเลย โดยตำแหนง 21 กไมไดเปลยนไป
  3. า list มไมครบในตาราง ตรงทขาดไปกจะเปนชองวาง
  4. การขนบรรทดใหมในตารางใช escape key \n ไมใช <br/> เหมอนใน Paragraph
  5. พวก 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 *
    

รายละเอยดของคำสงมงน

file function description
report_tags school.templatetags.report_tags
shift_display แปลงค
  • 0 -> รอบเชา และ
  • 1 -> รอบบาย
coarse_grade_display แสดงชนปแบบคราวๆ โดยจะใชาชนปแบบใดกได ผลเปนแบบหยาบเสมอ โดยจะแสดงเป
  • เตรยมอนบาล
  • อนบาล
  • ประถมศกษา
  • ธยมศกษาตอนต
  • ธยมศกษาตอนปลาย
  • ประกาศนยบตรวชาช
  • ปวส.
  • ปวท.
fine_grade_display แสดงชนปแบบเจาะจงชนป

โดยจะแสดงเป

  • เตรยมอนบาล
  • อ.1, อ.2, อ.3
  • ป.1, ป.2, ป.3, ป.4, ป.5, ป.6,
  • ม.1, ม.2, ม.3, ม.4, ม.5, ม.6,
  • ปวช.1-3
  • ปวส.1-3
  • ปวท.1-2
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