This commit is contained in:
JiriUhlir
2026-09-03 10:03:10 +02:00
parent 156289fe2d
commit a922117b3d
13 changed files with 583 additions and 59 deletions
+3 -1
View File
@@ -13,7 +13,7 @@ v tele requestu a vrati soubor PDF. Zvlada dokumenty o tisicich stranek.
## Aktualni stav
Verze 1.0.0, stav development.
Verze 1.0.1, stav development.
Hotovo:
@@ -28,6 +28,8 @@ Hotovo:
- fronta s omezenym poctem paralelnich workeru
- volitelny callback po dokonceni jobu
- strukturovane JSON logovani s job_id
- obchazeni chyby WeasyPrintu u obrazku s procentualni sirkou v bunce tabulky
- Swagger popisuje moznosti strankovani i uchovavani souboru
Neni hotovo a neni ani v zadani:
+46 -2
View File
@@ -25,6 +25,11 @@ Hlavicky odpovedi:
Pokud je `X-Missing-Assets` nenulovy, v PDF neco chybi. Detaily jsou dostupne
jen u asynchronni cesty, kde se vraci cely seznam.
Vysledek se nikam neuklada. Vznikne v docasnem adresari, odesle se v odpovedi
a hned po jejim odeslani se i s pracovnim adresarem smaze. Neexistuje adresa,
ze ktere by sel stahnout znovu. Kdo potrebuje vysledek pozdeji, pouzije
`POST /jobs`.
## POST /jobs
Zaradi konverzi do fronty. Vraci HTTP 202.
@@ -73,14 +78,38 @@ dokumentu ukazatel postupu probehne dvakrat.
## GET /jobs/{job_id}/result
Stahne hotove PDF. Soubor se streamuje, nenacita se cely do pameti.
Stahne hotove PDF. Soubor se streamuje, nenacita se cely do pameti. Stahovat
lze opakovane, dokud vysledek nevyprsi.
- 404 job neexistuje nebo uz expiroval
- 409 job jeste nedobehl nebo skoncil chybou
## DELETE /jobs/{job_id}
Zrusi bezici job nebo smaze hotovy vysledek.
Zrusi bezici job nebo smaze hotovy vysledek hned, bez cekani na expiraci.
Soubor z uloziste zmizi okamzite, zaznam jobu zustava jeste po dobu TTL, aby
bylo videt, co se s nim stalo.
## Uchovavani souboru
Nic se neuklada trvale. Vsechno zije jen v docasnem adresari `STORAGE_DIR`
a v pameti procesu.
| Co | Kde skonci | Jak dlouho |
|---|---|---|
| zdrojove HTML | jen v pameti behem konverze | do konce konverze |
| vysledek `POST /convert` | docasny adresar jobu | do odeslani odpovedi, pak se maze |
| vysledek `POST /jobs` | docasny adresar jobu | `JOB_RESULT_TTL_SECONDS` od dokonceni, vychozi 1 hodina |
| meziprodukty renderu | docasny adresar jobu | do dokonceni jobu, pak se mazou |
| vysledek neuspesneho jobu | nikde | pracovni adresar se maze hned |
Presny cas expirace je v poli `expires_at` u `GET /jobs/{job_id}`. Po nem se
smaze soubor i zaznam jobu a dalsi dotaz vraci 404 `job_not_found`.
Uloziste neni trvale. Restart sluzby znamena ztratu rozpracovanych jobu
i hotovych vysledku, ktere jeste nikdo nestahl. Rozpracovane joby se oznaci
jako failed s kodem `service_restarted`. Pri startu se navic smazou adresare
jobu, ktere po restartu zustaly bez zaznamu.
## GET /health
@@ -207,6 +236,21 @@ Delici body jsou elementy `section`, `article`, `h1`, elementy s atributem
`break-before`. Pokud dokument zadny takovy nema, renderuje se vcelku a sluzba
to zaloguje.
### obrazky v tabulkach
WeasyPrint neumi vyresit procentualni sirku obrazku uvnitr bunky tabulky.
Sirku bunky v tu chvili jeste nezna, obrazek vyjde nulove siroky a z PDF zmizi
bez jakekoliv chyby, takze se neobjevi ani v `missing_assets`.
Sluzba proto u enginu `weasyprint` u obrazku uvnitr `td` a `th` prepise
`width: <n>%` na `width: auto` a procentualni atribut `width` odstrani. Pokud
obrazek nema zadne `max-width`, doplni se `max-width: 100%`, aby z bunky
nevystoupil. Obrazek se tim vykresli ve sve vlastni velikosti omezene bunkou,
coz je to, co dokument zamyslel.
Chromia se to netyka, ten takove obrazky rozvrhne spravne, a uprava se u nej
neprovadi.
### wait_for
Pouziva jen Chromium. `state` je `load`, `domcontentloaded` nebo `networkidle`,
+1 -1
View File
@@ -8,7 +8,7 @@ runtime `.env`. Zadna promenna neni povinna, sluzba nastartuje i bez nich.
| Promenna | Vychozi | Vyznam |
|---|---|---|
| `APP_NAME` | `html-to-pdf` | nazev v dokumentaci a v odpovedi /version |
| `APP_VERSION` | `1.0.0` | verze |
| `APP_VERSION` | `1.0.1` | verze |
| `ROOT_PATH` | prazdne | prefix reverse proxy, napriklad `/apps/html-to-pdf` |
| `BASE_PATH` | prazdne | pouzije se, kdyz `ROOT_PATH` neni nastavene |
| `LOG_LEVEL` | `INFO` | uroven logovani |
+5
View File
@@ -77,6 +77,10 @@ Secrets se do logu nezapisuji.
konverze.
- WeasyPrint nespousti JavaScript. Pro dokumenty dokreslovane skripty je nutne
Chromium.
- WeasyPrint neumi procentualni sirku obrazku uvnitr bunky tabulky. Sluzba to
obchazi prepsanim na `width: auto`, viz api.md. Podobne vlastnosti se mohou
objevit i jinde, protoze WeasyPrint neni prohlizec. Kdyz neco v PDF chybi
a `missing_assets` je prazdne, stoji za to zkusit `engine: chromium`.
## Testy
@@ -97,4 +101,5 @@ Co je pokryte:
- spravnost cisel stranek po slouceni
- obsah ukazuje na skutecne stranky
- nedostupny asset render nezastavi a objevi se v odpovedi
- procentualni sirka obrazku v bunce tabulky se prepise na auto
- zruseni beziciho jobu, plna fronta, chovani pri ukonceni sluzby
+21
View File
@@ -1,5 +1,26 @@
# Zaznam zmen
## 1.0.1
Opraveno:
- obrazek uvnitr bunky tabulky, ktery ma sirku v procentech, uz z PDF nemizi.
WeasyPrint takovou sirku neumi vyresit proti bunce, jejiz sirku jeste nezna,
obrazek vysel nulove siroky a zmizel bez chyby, takze se neobjevil ani
v `missing_assets`. Sluzba nove u enginu `weasyprint` prepise u obrazku
v `td` a `th` `width: <n>%` na `width: auto`, odstrani procentualni atribut
`width` a doplni `max-width: 100%`, pokud zadne nema. Chromia se to netyka.
Typicky pripad je produktovy list, kde je fotka v levem sloupci tabulky.
Zmeneno:
- Swagger a OpenAPI popisuji moznosti strankovani, tedy `page`, `page_numbers`,
`chunking` a `toc`, vcetne omezeni jednotlivych rezimu cislovani
- Swagger a OpenAPI popisuji uchovavani souboru u `POST /convert` i u `POST /jobs`
vcetne doby dostupnosti vysledku a chovani po restartu sluzby
- pole odpovedi `JobState` a `JobProgress` maji v OpenAPI popis
- pribyl priklad tela requestu s cislovanim stranek na sirku stranky
## 1.0.0
Prvni implementace sluzby.