Report thẻ thành viên hai bài trước in ra rất đẹp — nhưng nó tự động dùng A4 dọc, khổ mặc định của công ty. Nếu bạn muốn in tấm thẻ trên A5 nằm ngang, hay một khổ tự do cho tem/nhãn, với lề riêng, thì cần khai một report.paperformat rồi gán cho report. Bài này đổi report sang A5 ngang và đo khổ trang PDF để chứng minh nó thật sự đổi.

Khai khổ giấy và gán vào report

report.paperformat là một model lưu mọi thông số vật lý của trang in: khổ, hướng, lề, DPI. Khai một bản ghi rồi trỏ report tới nó qua paperformat_id:

Ảnh chụp đoạn mã nền tối hai phần: phần một record report.paperformat id paperformat_the_a5 với format A5 kèm chú thích A4 A5 Letter custom, orientation Landscape kèm chú thích Portrait Landscape, margin_top bottom left right lần lượt 10 10 12 12, header_spacing 8, dpi 90; phần hai record ir.actions.report action_report_the gán field paperformat_id ref paperformat_the_a5; kèm chú thích format custom thì khai page_width page_height mm cho khổ tự do, không gán paperformat_id thì report dùng khổ mặc định công ty A4, paperformat chỉ áp cho PDF bản HTML không đổi

Hình 1: report.paperformat với format="A5", orientation="Landscape", các lề (mm) và dpi. Report trỏ tới nó bằng paperformat_id. Nếu format="custom", khai thêm page_width/page_height (mm) cho khổ tự do — hợp cho tem, nhãn dán kích thước lạ.

Bản in ra đúng A5 ngang

Gán xong, render report cho thẻ VIP-0001. Trang PDF giờ nằm ngang:

Ảnh chụp trang PDF thật đã render ở khổ ngang: tiêu đề Thẻ thành viên VIP-0001, bảng thông tin khách hàng hạng thẻ điểm trạng thái ngày cấp, mục Lịch sử tích điểm với bảng ba dòng và Tổng cộng 120, dòng cảm ơn, chân trang số điện thoại email website và Page 1 trên 1; toàn trang rộng hơn cao đúng kiểu khổ nằm ngang

Hình 2: Trang PDF thật ở khổ A5 nằm ngang — rõ ràng rộng hơn cao (khác hẳn A4 dọc). Cùng nội dung template (bảng lịch sử, tổng cộng 120) nhưng trải trên một tờ ngang. Chân trang có "Page 1/1".

Đo khổ trang — bằng chứng thật

Để chắc chắn paperformat đã áp (chứ không phải nhìn nhầm), tôi render PDF rồi đo kích thước trang bằng PyPDF2:

Ảnh chụp phiên odoo shell đo khổ trang PDF: paperformat gán cho report là Thẻ thành viên A5 ngang định dạng A5 hướng Landscape, lề top bottom left right là 10 10 12 12 mm; render PDF rồi đọc mediabox trang đầu cho khổ 595 x 420 pt tương đương 210 x 148 mm đúng A5 nằm ngang; chú thích so sánh A4 dọc mặc định là 595 x 842 pt 210 x 297 mm, chiều cao đổi từ 842 sang 420 nghĩa paperformat đã áp cho bản PDF

Hình 3: Đo MediaBox trang PDF: 595 × 420 pt = 210 × 148 mm — đúng A5 nằm ngang. So với A4 dọc mặc định (595 × 842 pt): chiều cao đổi từ 842 xuống 420. Con số không nói dối: paperformat đã đổi khổ trang thật.

Lưu ý quan trọng: chỉ áp cho PDF

Đây là điểm dễ vấp: paperformat chỉ áp cho bản PDF, không ảnh hưởng bản HTML. Nếu bạn xem qua /report/html/<name>/<id> (cách soi nhanh ở bài trước), trang vẫn hiện như cũ — vì đó là HTML trong trình duyệt, không có khái niệm "khổ giấy". Chỉ khi render PDF (_render_qweb_pdf hay bấm In), wkhtmltopdf mới đọc paperformat để đặt kích thước trang. Đừng hoảng khi thấy HTML không đổi.

Vài lưu ý khác

  • Không gán paperformat_id → report dùng khổ mặc định của công ty (res.company.paperformat_id, thường A4). Muốn đổi mặc định cho mọi report thì sửa ở công ty.
  • format="custom" mở ra page_width/page_height (mm) cho khổ bất kỳ — tem sản phẩm, nhãn dán, thẻ nhựa...
  • dpi ảnh hưởng độ nét và kích thước file; 90 là đủ cho tài liệu thường, tăng lên nếu in ảnh chất lượng cao.
  • header_spacing là khoảng cách giữa header và nội dung — chỉnh khi header bị đè hay hở quá.

Ba ý mang về

  1. report.paperformat khai thông số vật lý của trang in (format, orientation, các margin_*, dpi); gán cho report bằng paperformat_id. format="custom" + page_width/page_height cho khổ tự do.
  2. paperformat CHỈ áp cho PDF — bản HTML (/report/html) không đổi theo nó; đừng nhầm khi soi nhanh bằng HTML.
  3. Không gán thì dùng khổ mặc định công ty (thường A4); đo bằng chứng qua MediaBox của PDF — đã xác nhận A5 ngang 595×420 pt so với A4 dọc 595×842 pt.

Report giờ đúng khổ, đúng nội dung. Bài sau đụng tới việc thực tế nhất: Phần sau về kế thừa report có sẵn — cách chèn thêm nội dung của bạn vào một mẫu in chuẩn của Odoo (hoá đơn, phiếu...) mà không viết lại từ đầu.