# PyPDF2 Compatibility Patch - Account EDI UBL CII (OCB) ## Overview This package benefits from the PyPDF2 compatibility fixes implemented in the `oca-ocb-base` package. The account_edi_ubl_cii module uses `OdooPdfFileWriter` classes that are automatically compatible with PyPDF2 3.0.0+ through the main compatibility layer. ## Problem In PyPDF2 3.0.0, several classes and methods were deprecated and removed: - `PdfFileWriter` → `PdfWriter` - `PdfFileReader` → `PdfReader` - `cloneReaderDocumentRoot()` → `clone_reader_document_root()` - Various other method names changed ## Affected Functionality The account_edi_ubl_cii module uses PyPDF2 for: - UBL (Universal Business Language) invoice PDF generation - CII (Cross Industry Invoice) document processing - Electronic invoice XML embedding in PDFs - Standards-compliant electronic invoicing ## Solution **This package includes direct fixes** for PyPDF2 3.x page copying issue: 1. Uses `OdooPdfFileWriter` from `odoo.tools.pdf` (oca-ocb-base) for compatibility 2. **CRITICAL FIX**: Added explicit page copying after `cloneReaderDocumentRoot()` In PyPDF2 3.x, `cloneReaderDocumentRoot()` only copies document structure, not content pages. This was causing 327-byte empty PDFs. The fix includes explicit page copying: ```python writer.cloneReaderDocumentRoot(reader) # Copy all pages from the reader to the writer (required for PyPDF2 3.x) for page_num in range(reader.getNumPages()): page = reader.getPage(page_num) writer.addPage(page) ``` ## Files Using PyPDF2 ### `account_edi_ubl_cii/models/ir_actions_report.py` - Uses `OdooPdfFileWriter` for standards-compliant PDF generation (automatically compatible) - **FIXED**: Added explicit page copying after `writer.cloneReaderDocumentRoot(reader)` - Embeds UBL/CII XML in PDF documents ## Implementation Details **Direct code changes applied** in this package: 1. **Dependency**: Requires `oca-ocb-base` with `pdfwrite` branch for compatibility classes 2. **Page copying fix**: Added explicit page copying loop in `_render_qweb_pdf_prepare_streams()` 3. **Standards compliance**: UBL/CII standards maintained through compatibility layer ## Testing The compatibility has been verified with: - PyPDF2 3.0.0+ (new API) - PyPDF2 2.x (old API) - UBL invoice PDF generation - CII document processing - XML embedding in compliance documents ## Branch Information - **Branch**: `pdfwrite` - **Based on**: Current master branch - **Type**: Dependency compatibility (no direct patches) - **Impact**: Automatic compatibility through oca-ocb-base dependency ## Dependencies **CRITICAL**: This package requires: - `oca-ocb-base` package on `pdfwrite` branch - The main PyPDF2 compatibility layer must be active ## Standards Compliance This patch maintains compliance with: - **UBL 2.1**: Universal Business Language standard - **CII D16B**: Cross Industry Invoice standard - **EN 16931**: European electronic invoicing standard - **PDF/A-3**: Long-term archival PDF format ## Author - **Developer**: Ernad Husremović (hernad@bring.out.ba) - **Company**: bring.out.doo Sarajevo - **Date**: 2025-09-02 ## Related Issues This documentation addresses PyPDF2 compatibility for: - UBL electronic invoicing - CII standard compliance - European electronic invoicing (EN 16931) - B2B/B2G electronic document exchange ## Installation 1. Ensure `oca-ocb-base` is using the `pdfwrite` branch 2. Use this package's `pdfwrite` branch (for documentation compliance) 3. No additional installation steps required ## Future Considerations - Monitor oca-ocb-base compatibility updates - Test UBL/CII workflows with future PyPDF2 versions - Ensure continued standards compliance with PDF changes