Navigation

PDF-rapporter med WeasyPrint: arc_reports_base

Varför inte wkhtmltopdf?

Odoo använder wkhtmltopdf som standard för PDF-generering. Det är ett verktyg som konverterar HTML till PDF via en headless WebKit-motor. Det funkar. Typ. Tills du vill ha snygg typography, CSS Grid, Flexbox eller konsistenta sidhuvuden. Då slutar det funka.

wkhtmltopdf är baserat på en gammal version av WebKit som inte stödjer modern CSS. Det renderar sidor som om det vore 2015. Marginaler beter sig konstigt. Sidbrytningar hamnar mitt i tabellrader. Och att felsöka är en mardröm för det finns ingen inspektör – du får gissa dig fram.

WeasyPrint är alternativet. Det är ett Python-bibliotek som konverterar HTML och CSS till PDF. Det stödjer modern CSS, har bättre kontroll över sidbrytningar och producerar konsistenta resultat.

arc_reports_base

arc_reports_base är en modul som ersätter Odoos PDF-rendering med WeasyPrint. Den fångar upp rapportgenereringen innan wkhtmltopdf tar vid och kör HTML:en genom WeasyPrint istället.

Modulen fungerar transparent. Befintliga rapporter (fakturor, orderbekräftelser, packsedlar) renderas automatiskt med WeasyPrint utan att du behöver ändra något i rapportmallarna. Men du kan också skapa helt egna mallar som utnyttjar WeasyPrints fulla CSS-stöd.

Fakturor som ser professionella ut

Odoos standardfaktura är funktionell men anspråkslös. Med WeasyPrint och custom CSS designade jag en faktura som faktiskt representerar PlastShop. Logo i rätt storlek, korrekta marginaler, professionell typografi och en layout som fungerar oavsett om fakturan har tre rader eller trettio.

CSS för PDF skiljer sig från CSS för webben på några viktiga punkter:

@page {
    size: A4;
    margin: 20mm 15mm 25mm 15mm;
    @top-center {
        content: element(header);
    }
    @bottom-center {
        content: element(footer);
    }
}

table { page-break-inside: avoid; }
tr { page-break-inside: avoid; }
h2 { page-break-after: avoid; }

@page-regeln styr sidstorlek och marginaler. Element-funktionen låter dig definiera sidhuvud och sidfot som visas på varje sida. page-break-reglerna förhindrar att tabeller och rubriker delas över sidbrytningar.

Packsedlar

Packsedlarna var nästa utmaning. De ska vara tydliga för lagerpersonalen: vilka produkter, vilka mått, vilka kollin. Jag lade till streckkoder (genererade med Python-biblioteket python-barcode) så att lagret kan scanna kollin mot packsedeln.

En packsedel för cut-to-size-ordrar visar även kundens beställda mått: ”Polykarbonat klar, 450x780mm, 5mm tjock, 3 st”. Den informationen hämtas från VisualCutter-modulens extra fält på orderraden.

Tekniska specifikationsblad som PDF

TSB-data som lagras strukturerat i Odoo (från arc_industrial_core) kan exporteras som snygga PDF:er. Kunden får ett dokument med materialegenskaper presenterade i en tydlig tabell med PlastShop-branding. Bättre än leverantörens scannade PDF från 2003.

arc_plastshop_reports

arc_reports_base tillhandahåller motorn. arc_plastshop_reports innehåller de PlastShop-specifika mallarna. Uppdelningen gör att basmodulen kan återanvändas av andra Odoo-instanser (ARC Gruppen, HeartPro) medan PlastShop-specifika designer lever i sin egen modul.

PlastShop-rapporterna inkluderar:

  • Faktura med materialspecifika detaljer
  • Orderbekräftelse med leveranstider per rad
  • Packsedel med streckkoder och måttspecifikationer
  • Offert med giltighet och villkor
  • TSB-export med PlastShop-branding

CSS-till-PDF – utmaningar

WeasyPrint är bättre än wkhtmltopdf men det är inte en webbläsare. Vissa CSS-egenskaper som fungerar i Chrome fungerar inte i WeasyPrint. Några saker jag lärde mig:

Flexbox funkar men med begränsningar. Undvik flex-wrap i kombination med page-break – det kan ge oväntade resultat. Grid fungerar bättre för sidlayouter.

Bilder måste ha explicit storlek. WeasyPrint gissar inte bildstorlekar lika bra som webbläsare. Sätt alltid width och height, annars kan bilden bli enorm eller försvinna helt.

Fonter behöver vara tillgängliga på servern. WeasyPrint laddar inte Google Fonts automatiskt. Jag installerade fonterna lokalt i Docker-containern och refererar till dem med @font-face i CSS:en.

Färger i tryck. RGB-färger kan se annorlunda ut i PDF jämfört med skärm. Jag testade alla rapporter genom att skriva ut dem på en riktig skrivare för att verifiera att färgerna var acceptabla.

Prestanda

WeasyPrint är långsammare än wkhtmltopdf. En enkel faktura genereras på 1-2 sekunder. En komplex rapport med bilder och tabeller kan ta 3-5 sekunder. Det är acceptabelt för on-demand-generering men skulle bli ett problem vid batch-generering av hundratals fakturor.

Lösningen: batch-generering körs asynkront via en kö. Fakturorna genereras i bakgrunden och kunden notifieras när de är klara. Enskilda fakturor genereras fortfarande on-demand.

Var det värt att byta från wkhtmltopdf?

Absolut. Skillnaden i kvalitet är enorm. Fakturorna ser professionella ut. Packsedlarna är tydliga. Och jag har full kontroll över layouten via standard CSS utan att behöva hacka runt wkhtmltopdf:s begränsningar.

Om du kör Odoo och är missnöjd med PDF-kvaliteten: titta på WeasyPrint. Det kräver lite mer setup men resultatet är värt det.

Vad tycker du?

Jag vill gärna höra dina tankar. Kommentera nedan eller nå mig på LinkedIn.

0 0 röster
Article Rating
Prenumerera
Meddela vid
guest
0 Kommentarer
Äldsta
Senaste Mest omröstade
Inline feedback
Visa alla kommentarer

Relaterade inlägg

Vad är ett förlossningsbrev och varför är det bra att ha?
Vård
Vad är ett förlossningsbrev?

Inför en förlossning är det en strålande iidé att skriva ett förlossningsbrev! En förlossning är en av livets mest intensiva upplevelser. Det är också en

Chrille Hedberg logotyp
Chrille Hedberg

Använd gärna detta formulär för att komma i kontakt med mig.

0
Lämna gärna en kommentarx
()
x