Xuất file pdf với python sử dụng thư viện pypdf
TIL
720
Python
58
pypdf
1
Male avatar

pkt_zz viết ngày 12/03/2019

Xuất file pdf với python sử dụng thư viện pypdf

Do nhu cầu công việc mình cần tạo file pdf rồi gửi qua email cho mỗi người một file riêng. Trước đây để xuất tất cả dữ liệu ra 1 file pdf bằng birt report sau đó dùng tool cắt file và gửi bằng tay. Hoặc dùng birt report xuất file pdf cho từng người rồi gửi bằng tay…
Bây giờ số người cần gửi tăng lên, mình không thể gửi bằng tay như vậy được nên cần phải làm tự động thao tác này.
Bước cần làm đó là chuẩn bị cơ sở dữ liệu là excel hoặc database, sau đó dùng command line xuất file và gửi email cho từng người. Bước khó khăn đầu tiên và nhiều nhất đó là sử dụng python tự động xuất ra file pdf. Mình quyết định dùng môi trường windown và code bằng python với thư viện pypdf.

Link quan trọng để làm theo: https://www.blog.pythonlibrary.org/2018/06/05/creating-pdfs-with-pyfpdf-and-python/

Các bước quan trọng:

Bước 1: Cài python cho windown (google)
Bước 2: Cài pip cho python
Bước 3: Cài pyfpdf: python -m pip install fpdf
Bước 4: Tải và sử dụng Unicode với pyfpdf: https://pyfpdf.readthedocs.io/en/latest/Unicode/index.html
Đoạn code quan trọng để in ra được tiếng việt: pdf.add_font(‘DejaVu’, ”, ‘DejaVuSansCondensed.ttf’, uni=True)

Thành công khi kết hợp các ví dụ cơ bản trong link trên.

#!/usr/bin/python

# -*- coding: utf8 -*-

from fpdf import FPDF

class CustomPDF(FPDF):

    def header(self):
        # Set up a logo
        self.image('logo.jpg', 10, 8, 33)
        self.set_font('Arial', 'B', 10)

        # Add an address
        self.cell(50)
        self.cell(0, 5, 'CONG TY TNHH A VIET NAM', ln=1)
        self.cell(58)
        self.cell(0, 5, 'Dia chi: Tang 15, Thap A, Toa nha A,', ln=1)
        self.cell(60)
        self.cell(0, 5, '5321 Kim Ma, Ngoc Khanh, Ba Dinh, Ha Noi', ln=1) 
        self.cell(60)
        self.cell(0, 5, 'Tel: (+84-4) 6272 6600 -- Fax: (+84-4) 3771 4781', ln=1) 
        # Line break
        self.ln(8)
        self.cell(40)
        self.cell(0, 5, 'BANG TONG HOP CHIET KHAU THUONG MAI TREN DOANH SO', ln=1) 
        self.cell(60)
        self.cell(0, 5, 'CUA DAI LY BAN LE THANG 01/2019', ln=1) 

    def footer(self):
        self.set_y(-10)

        self.set_font('Arial', 'I', 8)

        # Add a page number
        page = 'Page ' + str(self.page_no()) + '/{nb}'
        self.cell(0, 10, page, 0, 0, 'C')

def create_pdf(pdf_path):
    data = [['','','', 'Thông tin tổng đại lý'],
            ['','','Tên', 'Cong ty TNHH Thang Lai'],
            ['','','Mã', '17000'],
            ]
    data1 = [['STT','MA','TEN DAI LY', 'SO LUONG TB MOI','THANH TIEN(VND)'],
                ['1','6501','Pham Khac Tuy rat Dep trai lai con hoc gioi', '100','45000'],
                ['2','6502','ABC', '200','90000'],
                ['2','6502','ABC', '200','90000'],
                ['2','6502','ABC', '200','90000'],
                ['3','6503','CONG TY TNHH THIET BI VA CONG NGHE NGOC ANH', '200','90000'],
                ['','','', 'Tong tien gop','225000']
            ]
    data4 = [['','NGUOI LAP BIEU','','KE TOAN TRUONG'],
                ['','','',''],
                ['','','',''],
                ['','','',''],
                ['','','',''],
                ['','','','NGUYEN THI TO HAO']
                ]           
    d2='CÔNG TY TNHH ATM VIỆT NAM'
    d1='CONG TY TNHH ATM TINH VIET NAM'
    d3='Địa chỉ: Tầng 15, Tháp A, Tòa Nhà B,'
    d31='Dia chi: Tang 15, Tháp A, Tòa Nhà B'
    pdf = FPDF()
    # Create the special value {nb}
    pdf.alias_nb_pages()
    pdf.add_page()
    pdf.set_font('DejaVu', '', 12)
    pdf.add_font('DejaVu', '', 'DejaVuSansCondensed.ttf', uni=True)
    pdf.set_font('DejaVu', '', 14)
    pdf.image('logo.jpg', x=10, y=8, w=20)
    pdf.set_font('DejaVu', '', 10)
    pdf.cell(200, 5, txt=d2, ln=1, align="C")
    pdf.set_font('DejaVu', '', 8)
    pdf.cell(200, 5, txt=d31, ln=1, align="C")
    pdf.cell(200, 5, txt="521 Kim Ma, Ngoc Khanh, Ba Dinh, Ha Noi.", ln=1, align="C")
    pdf.cell(200, 5, txt="Tel: (+84-4) 6272 6600 -- Fax: (+84-4) 3771 4781", ln=1, align="C")
    pdf.ln(8)
    pdf.set_font('DejaVu', '', 12)
    pdf.cell(200, 5, txt='BANG TONG HOP CHIET KHAU THUONG MAI TREN DOANH', ln=1, align="C")
    pdf.cell(200, 5, txt='SO CUA DAI LY BAN LE THANG 1/2019', ln=1, align="C")
    pdf.ln(8)
    pdf.set_font('DejaVu', '', 10)
    col_width = pdf.w / 4.5
    row_height = pdf.font_size
    for row in data:
        for item in row:
            pdf.cell(col_width, row_height*1,txt=item, border=0)
        pdf.ln(row_height*1)
    pdf.cell(20, 5, txt='Ngay xuat:', ln=1, align="C")
    pdf.ln(8)
    col_width = pdf.w / 5.5
    col_width1 = col_width*1/3
    col_width2 = col_width*1/3
    col_width3 = col_width+col_width*2/3+col_width*2/3
    row_height = pdf.font_size
    i=0
    for row in data1:
        i=i+1
        if i==1:
            j=0
            for item in row:
                pdf.set_font('Times', 'B', 10)
                j=j+1
                if j==1:
                    pdf.cell(col_width1, row_height*1.4,txt=item, border=1,ln = 0, align = 'C', fill = False, link = '')
                else:
                    if j==3:
                        pdf.cell(col_width3, row_height*1.4,txt=item, border=1,ln = 0, align = 'C', fill = False, link = '')
                    else:
                        if j==2:
                            pdf.cell(col_width2, row_height*1.4,txt=item, border=1,ln = 0, align = 'C', fill = False, link = '')
                        else:
                            pdf.cell(col_width, row_height*1.4,txt=item, border=1,ln = 0, align = 'C', fill = False, link = '')
        else:
            j=0
            for item in row:
                pdf.set_font('Times', '', 10)
                j=j+1
                if j==1:
                    pdf.cell(col_width1, row_height*1.4,txt=item, border=1, align = 'C', fill = False)
                else:
                    if j==3:
                        pdf.cell(col_width3, row_height*1.4,txt=item, border=1, align = 'L', fill = False)
                    else:
                        if j==2:
                            pdf.cell(col_width2, row_height*1.4,txt=item, border=1, align = 'C', fill = False)
                        else:
                            pdf.cell(col_width, row_height*1.4,txt=item, border=1, align = 'R', fill = False)
        pdf.ln(row_height*1.4)
    line_no = 1
    pdf.ln(8)
    pdf.set_font('DejaVu', '', 10)
    col_width = pdf.w / 4.5
    row_height = pdf.font_size
    for row in data4:
        for item in row:
            pdf.cell(col_width, row_height*1,txt=item, border=0)
        pdf.ln(row_height*1)
#   for i in range(50):
#       pdf.cell(0, 10, txt="Line #{}".format(line_no), ln=1)
#       line_no += 1        
    pdf.output(pdf_path)

if __name__ == '__main__':
    create_pdf('header_footer.pdf')

Bài viết được đăng lại từ blog của mình: [Xuất file pdf với python sử dụng thư viện pypdf]https://trituenhantao.info/2019/02/20/xuat-file-pdf-voi-python-su-dung-thu-vien-pypdf/
pkt_zz 12-03-2019

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

Male avatar

pkt_zz

4 bài viết.
0 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
Male avatar
1 0
ChatterBot là gì? ChatterBot là một công cụ tạo ra một chat bot tự động dựa trên cơ sở học máy (machine learning) bằng ngôn ngữ Python. ChatterBot...
pkt_zz viết hơn 1 năm trước
1 0
Bài viết liên quan
White
7 3
Description Mình là một thằng thích đọc sách. Nhưng lúc nào cũng bận (lười) nên cũng mấy tháng rồi chưa hoàn thành được quyển sách nào. Mình đa số...
Rice viết 7 tháng trước
7 3
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


Male avatar
{{userFollowed ? 'Following' : 'Follow'}}
4 bài viết.
0 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!