Giới thiệu
Các mẫu là các tài liệu được xác định trước [như hóa đơn, biểu mẫu thuế, v.v.], trong đó mỗi phần tử [văn bản, dòng, mã vạch, v.v.] có một vị trí cố định [x1, y1, x2, y2], kiểu [phông chữ, kích thước, v.v. ] và một văn bản mặc định.
Các yếu tố này có thể đóng vai trò là người giữ chỗ, vì vậy chương trình có thể thay đổi văn bản mặc định "điền" tài liệu.
Ngoài ra, các phần tử có thể được xác định trong tệp CSV hoặc trong cơ sở dữ liệu, do đó người dùng có thể dễ dàng điều chỉnh biểu mẫu với nhu cầu in ấn của mình.
Một mẫu được sử dụng giống như một dict, đặt giá trị của các mục của nó.
Chi tiết - Định nghĩa mẫu
Một mẫu bao gồm một tiêu đề và một danh sách các yếu tố.
Tiêu đề chứa định dạng trang, tiêu đề của tài liệu và siêu dữ liệu khác.
Các phần tử có các thuộc tính sau [các cột trong CSV, các trường trong cơ sở dữ liệu]:
- Tên: Nhận dạng người giữ chỗ
- Loại: 'T': Texts, 'L': Lines, 'I': Hình ảnh, 'B': Hộp, 'BC': Mã vạch
- x1, y1, x2, y2: tọa độ trên cùng bên trái [tính bằng mm]
- Phông chữ: ví dụ: "Arial"
- Kích thước: Kích thước văn bản tính theo điểm, ví dụ: 10
- in đậm, in nghiêng, gạch chân: kiểu văn bản [không trống để kích hoạt]
- Tiền cảnh, nền: văn bản và màu sắc điền, ví dụ: 0xffffff
- Căn chỉnh: Căn chỉnh văn bản, 'l': trái, 'r': phải, 'c': trung tâm
- Văn bản: Chuỗi mặc định, có thể được thay thế khi chạy
- Ưu tiên: Z-order
- Multiline: Không có cho dòng đơn [mặc định], đúng với Multicells [nhiều dòng], trang bị sai để phù hợp chính xác với không gian được xác định
Cách tạo mẫu
Một mẫu có thể được tạo theo 3 cách:
- Bằng cách xác định mọi thứ theo cách thủ công theo cách được mã hóa cứng
- Bằng cách sử dụng một định nghĩa mẫu trong tài liệu CSV và phân tích CSV bằng mẫu.parse_dict []
- Bằng cách xác định mẫu trong cơ sở dữ liệu [điều này áp dụng cho tích hợp Web2Py]
Lưu ý sau đây, định nghĩa của một mẫu sẽ chứa các yếu tố. Tiêu đề sẽ được đưa ra trong quá trình khởi tạo [ngoại trừ phương thức cơ sở dữ liệu].
Ví dụ - mã hóa cứng
from fpdf import Template
#this will define the ELEMENTS that will compose the template.
elements = [
{ 'name': 'company_logo', 'type': 'I', 'x1': 20.0, 'y1': 17.0, 'x2': 78.0, 'y2': 30.0, 'font': None, 'size': 0.0, 'bold': 0, 'italic': 0, 'underline': 0, 'foreground': 0, 'background': 0, 'align': 'I', 'text': 'logo', 'priority': 2, },
{ 'name': 'company_name', 'type': 'T', 'x1': 17.0, 'y1': 32.5, 'x2': 115.0, 'y2': 37.5, 'font': 'Arial', 'size': 12.0, 'bold': 1, 'italic': 0, 'underline': 0, 'foreground': 0, 'background': 0, 'align': 'I', 'text': '', 'priority': 2, },
{ 'name': 'box', 'type': 'B', 'x1': 15.0, 'y1': 15.0, 'x2': 185.0, 'y2': 260.0, 'font': 'Arial', 'size': 0.0, 'bold': 0, 'italic': 0, 'underline': 0, 'foreground': 0, 'background': 0, 'align': 'I', 'text': None, 'priority': 0, },
{ 'name': 'box_x', 'type': 'B', 'x1': 95.0, 'y1': 15.0, 'x2': 105.0, 'y2': 25.0, 'font': 'Arial', 'size': 0.0, 'bold': 1, 'italic': 0, 'underline': 0, 'foreground': 0, 'background': 0, 'align': 'I', 'text': None, 'priority': 2, },
{ 'name': 'line1', 'type': 'L', 'x1': 100.0, 'y1': 25.0, 'x2': 100.0, 'y2': 57.0, 'font': 'Arial', 'size': 0, 'bold': 0, 'italic': 0, 'underline': 0, 'foreground': 0, 'background': 0, 'align': 'I', 'text': None, 'priority': 3, },
{ 'name': 'barcode', 'type': 'BC', 'x1': 20.0, 'y1': 246.5, 'x2': 140.0, 'y2': 254.0, 'font': 'Interleaved 2of5 NT', 'size': 0.75, 'bold': 0, 'italic': 0, 'underline': 0, 'foreground': 0, 'background': 0, 'align': 'I', 'text': '200000000001000159053338016581200810081', 'priority': 3, },
]
#here we instantiate the template and define the HEADER
f = Template[format="A4", elements=elements,
title="Sample Invoice"]
f.add_page[]
#we FILL some of the fields of the template with the information we want
#note we access the elements treating the template instance as a "dict"
f["company_name"] = "Sample Company"
f["company_logo"] = "pyfpdf/tutorial/logo.png"
#and now we render the page
f.render["./template.pdf"]
Xem Template.py hoặc Web2py để biết ví dụ hoàn chỉnh.
Ví dụ - các phần tử được xác định trong tệp CSV
Bạn xác định các phần tử của mình trong tệp CSV "mycsvfile.csv" sẽ trông giống như:
line0;T;20.0;13.0;190.0;13.0;times;10.0;0;0;0;0;65535;C;;0
line1;T;20.0;67.0;190.0;67.0;times;10.0;0;0;0;0;65535;C;;0
name0;T;21;14;104;25;times;16.0;0;0;0;0;0;C;;2
title0;T;64;26;104;30;times;10.0;0;0;0;0;0;C;;2
Hãy nhớ rằng mỗi dòng đại diện cho một phần tử và mỗi trường đại diện cho một trong các thuộc tính của phần tử theo thứ tự sau: ['tên', 'loại', 'x1', 'y1', 'x2', 'y2', 'font ',' kích thước ',' in đậm ',' in nghiêng ',' gạch chân ',' tiền cảnh ',' nền ',' align ',' text ',' ưu tiên ',' multiline ']
Sau đó, bạn có thể sử dụng tệp như thế này:
def test_template[]:
f = Template[format="A4",
title="Sample Invoice"]
f.parse_csv["mycsvfile.csv"]
f.add_page[]
f["company_name"] = "Sample Company"
response.headers['Content-Type'] = 'application/pdf'
return f.render["./template.pdf", dest='S']
Thư viện này bao gồm một chương trình designer.py
để sửa đổi trực quan các thiết kế của một mẫu [ví dụ: hóa đơn, báo cáo, v.v.].
Các tệp đầu vào là bảng tính CSV mô tả thiết kế [xem ở trên]. Sau khi mở, nhà thiết kế hiển thị mẫu với các yếu tố như cách chúng sẽ được định vị.
Thanh công cụ có nút cho:
- Mở, lưu và in [xem trước] mẫu
- Thêm, xóa và sao chép
- Tìm các mục theo tên hoặc bằng văn bản
- Tìm và thay thế [sửa đổi các phần tử đã chọn, chủ yếu là di chuyển x/y]
Trên một phần tử, nhấp chuột trái sẽ mở hộp thoại để chỉnh sửa văn bản của nó và nhấp chuột phải mở hộp thoại với cửa sổ Thuộc tính. Bạn có thể chọn nhiều mục bằng cách giữ Shift và nhấp chuột trái chúng. Để di chuyển các phần tử, bạn có thể sử dụng các phím mũi tên hoặc kéo các phần tử.
Để chạy nó, chỉ cần đi đến thư mục và chạy:
python designer.py
[Bạn cần cài đặt WX].
Nếu bạn gặp sự cố khi nó hoạt động, hãy thay đổi nhập vào tệp Designer.py thành phần sau [nó sẽ được sửa trong phiên bản tiếp theo]:
import os, sys
import wx
import wx.lib
import wx.lib.ogl as ogl
try:
from wx.lib.wordwrap import wordwrap
except ImportError:
wordwrap = lambda text, width, dc: text
try:
from template import Template
except ImportError:
# we are frozen?
from fpdf.template import Template
Ví dụ, ảnh chụp màn hình sau đây hiển thị trình thiết kế trực quan, với tệp hóa đơn mẫu.csv mở và phần tử 'logo' được chọn, chỉnh sửa các thuộc tính của nó: