n8n-nodes-approval-pdfmake
v0.1.6
Published
Fixed-template Vietnamese Lark approval PDFs for n8n, with PDF/JPEG/PNG merging. No custom HTML/CSS or template designer.
Maintainers
Readme
n8n-nodes-approval-pdfmake
Fixed-template Vietnamese approval PDFs for n8n, using Lark Approval data.
Mẫu phiếu cố định — không có trình thiết kế giao diện. Node tạo phiếu tiếng Việt theo bố cục bên dưới, sau đó ghép chứng từ PDF/JPG/PNG. Bạn có thể thay dữ liệu và tên khóa JSON đầu vào. Bố cục bảng, vị trí các mục và giao diện phiếu được định nghĩa sẵn trong source.
Scope: Create Approval PDF expects Lark Approval-shaped JSON and uses the built-in layout shown below. There is no visual template editor, custom HTML/CSS rendering, or arbitrary PDFMake document definition input. Changing the layout requires editing the source and rebuilding the package. Download and Merge operations can also be used independently, without generating an approval form.
Output preview / Mẫu PDF đầu ra

Ảnh là trang đầu của PDF do node tạo, dùng hoàn toàn dữ liệu giả. Các trường có dữ liệu khác nhau sẽ có nội dung/độ dài khác nhau; phiếu dài có thể sang nhiều trang. / Synthetic sample output; longer content may span multiple pages.
Xem PDF mẫu đầy đủ / View the complete sample PDF — phiếu → PDF đề nghị → JPG → PNG → PDF bình luận; các tên file trên phiếu có liên kết tới trang chứng từ.
Xử lý cục bộ
Community node Approval PDFMake tạo phiếu bằng [email protected], ghép toàn bộ trang PDF và chèn ảnh JPG/JPEG/PNG bằng [email protected].
Không cần Chromium, LibreOffice, API chuyển đổi PDF, font hệ thống hoặc NODE_FUNCTION_ALLOW_EXTERNAL. Font Roboto được đóng gói cùng PDFMake. Các thư viện là dependencies của community node, không import từ Code node.
Phạm vi
- Create Approval PDF: dựng phiếu A4 từ dữ liệu Lark Approval và danh sách nhân sự; phiếu đứng đầu, các PDF theo thứ tự mảng
attachments. - Download PDF/JPEG/PNG Attachments: tải signed HTTPS URLs thành binary n8n, cập nhật
binaryPropertytheo ID ổn định và giữ MIME đúng. - Merge PDFs and Images: ghép các PDF và ảnh JPG/JPEG/PNG sẵn có mà không tạo phiếu.
Từ 0.1.1, hỗ trợ PDF + JPG/JPEG. Mỗi JPEG nằm trên một trang A4, co vừa trong lề 36 pt, giữ tỷ lệ, không cắt ảnh; xử lý đủ 8 hướng EXIF gồm xoay và lật. Ảnh hiện trực tiếp trong PDF, không chỉ tên hoặc URL. Giữ nguyên dữ liệu JPEG nén khi nhúng. [email protected] kiểm tra giải mã trong worker, giới hạn 60 MP, cạnh tối đa 16.384 pixel và khoảng 256 MiB cấp phát decoder; ảnh vượt giới hạn hoặc hỏng gây lỗi rõ.
Từ 0.1.2, thêm PNG tĩnh, giữ tỷ lệ và độ trong suốt, một ảnh trên một trang A4. [email protected] kiểm tra CRC/giải mã và chuẩn hóa RGBA8 trong worker; hỗ trợ palette, grayscale, 16-bit và Adam7. Giới hạn PNG 16 MP, cạnh 16.384 pixel, tối đa 10.000 chunks; kiểm tra kích thước và giới hạn giải nén trước khi decode. PNG động (APNG) bị từ chối để tránh bỏ sót frame.
WebP và Office, file rỗng/hỏng/mã hóa hoặc tải lỗi sẽ báo lỗi. Không tự bỏ qua file. Mẫu PDFMake riêng mô phỏng phiếu A4; không chuyển đổi HTML/CSS và không thực thi HTML/JavaScript. pdfDefinition tùy ý không được sử dụng. Các annotation và hành động ở cấp trang bị bỏ khi ghép; biểu mẫu PDF tương tác cần được flatten trước khi đưa vào.
Đầu vào
Một item tương ứng một PDF đầu ra. Có thể đổi tên khóa JSON mặc định trong node; việc này không thay bố cục hay thêm các mục tùy ý vào mẫu phiếu:
{
"approval": {
"serial_number": "DEMO-0001",
"user_id": "demo_requester",
"status": "PENDING",
"parsed_form": [],
"task_list": [],
"comment_list": []
},
"users": [{ "user_id": "demo_requester", "name": "Người dùng mẫu" }],
"fileName": "phieu.pdf",
"attachments": [
{ "id": "attachment_001", "file_name": "chung-tu.pdf", "binaryProperty": "source_pdf" }
]
}Đặt PDF vào item.binary.source_pdf qua n8n binary helpers. Metadata không phải dữ liệu base64. Dùng binaryProperty để đọc cả binary lưu filesystem/S3. Nếu không có attachments ở chế độ Binary Only, node lấy tất cả binary theo thứ tự thuộc tính. Nếu có metadata, mọi binary phải được ánh xạ rõ ràng; ID không được trùng. Mảng rỗng tạo riêng phiếu.
Ở chế độ Signed HTTPS URLs hoặc Hybrid, attachment có thể chứa url thay cho binary. Allowed Download Hostnames mặc định rỗng: điền hostname chính xác đã xác minh, phân cách bằng dấu phẩy, không dùng wildcard. Hybrid ưu tiên binary đã ánh xạ, nếu chưa có mới tải URL.
Từ 0.1.3, có thể kéo thả download_hostnames_csv vào Allowed Download Hostnames, tương đương expression {{ $json.download_hostnames_csv }}. Kết quả expression phải nằm trong Trusted Hosts for Expressions, một danh sách cố định đã điền hai CDN Lark lf16-approval-file-sign.larksuitecdn.com, p16-approval-sign.larksuitecdn.com. Nếu có miền khác, xác nhận rồi thêm tại Trusted dưới dạng Fixed; payload không thể tự cấp quyền cho miền ngoài danh sách này. Runtime từ chối Trusted chứa expression. Allowed dạng Fixed vẫn giữ hành vi cũ.
Node kiểm tra HTTPS/443, TLS, DNS public, pin địa chỉ IP đã kiểm tra, chặn IP nội bộ/loopback/metadata và redirect khác origin. Không gửi Authorization/cookie; signed URL phải tự đủ quyền tải. Không ghi signed URL vào lỗi. Không có request mạng khi dựng phiếu hoặc ghép PDF. Kết nối mạng duy nhất do node tạo là tải chứng từ khi chế độ URL được bật.
Đầu ra và giới hạn
PDF nằm ở binary.data mặc định, MIME application/pdf; mở Binary → data → Download trong n8n. JSON có complete, pages, formPages, attachmentReports với số trang và thứ tự. Lỗi dừng item; nếu chủ động bật Continue On Fail thì nhận complete: false và không có PDF thành công.
Mặc định: 30 file, 25 MiB/file, 100 MiB tổng, 300 trang, 120 giây/item và 150 MiB đầu ra. Tham số bị giới hạn tối đa 4 lần mức mặc định. Worker riêng có V8 heap 512 MiB, deadline cưỡng chế dừng, 1 tác vụ xử lý đồng thời và tối đa 8 tác vụ chờ/process. Đây không phải sandbox OS; hosting vẫn cần đủ RAM và hỗ trợ Node.js worker threads. Không chạy mã hay tải resource từ nội dung phiếu.
Cài đặt và build
Cài qua Settings → Community nodes → Install, nhập tên và phiên bản đã phát hành:
[email protected]Hoặc cài tarball vào staging do bạn quản lý:
cd ~/.n8n/nodes
npm install /absolute/path/n8n-nodes-approval-pdfmake-0.1.6.tgzSau khi cài tarball, khởi động lại n8n và tìm Approval PDFMake. Nếu nhà cung cấp chỉ cho nhập tên package npm trong GUI thì chỉ cài được phiên bản thực sự có trên npm; import workflow JSON không tự cài node. Hosting cần cho phép community package chưa được xác minh và hỗ trợ Node.js worker threads. Chưa xác nhận khả năng cài trên từng hosting.
Từ thư mục source package:
npm ci
npm run lint
npm run typecheck
npm test
npm packTrên Windows dùng npm.cmd nếu PowerShell chặn npm.ps1. Yêu cầu Node.js >=22.16, peer n8n-workflow 2.x; đã kiểm thử n8n 2.4.1 và 2.43.7 cục bộ. Không cam kết mọi phiên bản hosting. Tarball chứa code build, font/giấy phép, icon, README, metadata và hai file minh họa công khai bằng dữ liệu giả; không chứa workflow riêng hoặc credential.
Các bản cập nhật gần đây
- 0.1.6: làm rõ mẫu phiếu cố định bằng tiếng Việt/Anh, thêm ảnh và PDF mẫu bằng dữ liệu giả vào README/package. Không đổi runtime hoặc bố cục PDF so với 0.1.5.
- 0.1.5: font Noto Emoji dự phòng hiển thị ❌ ➖ ✅ 💳 đen trắng trong phiếu, bình luận và nhãn ảnh. Chữ Việt dùng Roboto; font/giấy phép SIL OFL 1.1 và thông tin nguồn nằm trong
dist/assets, không tải font mạng khi chạy. - 0.1.4: chọn File Name Source → Approval Serial and Reason để đặt
<serial_number>_<lý do sạch>.pdf, giữ dấu Việt, bỏ emoji/xuống dòng/ký tự cấm, tối đa 120 ký tự/240 byte. Input File Name Field giữ tên đặt sẵn. Tài liệu đính kèm chỉ có proposal_file; bill ở bình luận. Trang ảnh có tên file; tên file trên phiếu/bình luận liên kết tới trang chứng từ. Annotation/action từ PDF nguồn bị bỏ.
