Požadavek #147
otevřenýE-knihy Pierot: převod PDF→EPUB a prodej jedné knihy ve víc podobách (noveknihy.com)
Popis
Zpětně založený tiket k hotové práci (repo /home/f/git/noveknihy, větev main, commity 1974f932…7d3221f0). Zákazník: Pierot (nakladatelství), pilotní titul Louskáček.
h3. 1. Převodník PDF→EPUB (bin/pdf2epub)
- Původní písma z PDF v reflowable verzi (--orig-fonts). Přitom opravena chyba, kvůli které se nadpisy faksimile nikdy nevykreslily svým písmem: font vytažený z PDF nemá tabulku post, kterou webový font mít musí, a každý prohlížečový engine ho odmítne.
- Dvoustrany (--spreads): každá půlka archu se hlásí, na které straně hřbetu byla vytištěna. Rozevření bez textu (předsádka) se neřeže na půlky, jinak se v jednostránkovém režimu ukázalo dvakrát po sobě.
- Automatický ořez ilustrací (pdf2epub/motif.py): malba se hledá podle odchylky od barvy podkladu strany, výřez je nejmenší okno od čtverce po 4:2, které pobere většinu malby. Dvě skupiny daleko od sebe se vyříznou a postaví těsně vedle sebe.
- Kompatibilita se starými čtečkami: text rozdělený po kapitolách, každé písmo vložené jako woff2 i nekomprimované sfnt, CFF obrysy překreslené na TrueType, čisté cesty v manifestu.
- Obrázek nevytlačí text ze stránky: šířka zapsaná u každého obrázku podle jeho tvaru, tištěná strana přestala být flex kontejnerem (ten se ve sloupcích neláme).
- Vypnuto bílé stínování živého textu faksimile (profil edice, halo 0).
h3. 2. Soubory pro Kindle (bin/epub2kindle, bin/kindlegen.Dockerfile)
- Kontejner s Amazonovým kindlegen vytaženým z balíku Kindle Previeweru (jeho GUI je React Native v MSIX, Wine ho nespustí; engine pod ním je obyčejný Win32). Slouží zároveň jako kontrola: je to táž validace, kterou dělá KDP při nahrání.
- Reflowable jde přes Calibre (.azw3, čistý KF8), pevná sazba přes kindlegen (.mobi, nese MOBI6 i KF8). Faksimile prochází Amazonovým převodem bez jediné výstrahy po doplnění kindlovských metadat do OPF.
h3. 3. Obchod: jedna e-kniha, víc souborů
- Nová tabulka upload_files (migrace 20260922100000). Produkt má nově dva druhy, tištěný a elektronický; PDF přestalo být samostatným formátem a je jedním ze souborů. Varianta přejmenována na "E-kniha" (migrace 20260922110000).
- Soubor se všude hledá podle produktu (CustomerLibrary::fileFor), jméno u nároku je jen záloha pro staré řádky. Požadavek jmenuje druh (azw3), nikdy jméno souboru.
- Tři stránky na dvě patra: knihovnička (polička s knihami, po rozkliknutí detail s podobami), detail objednávky a produktová stránka. U každé podoby věta, k čemu je ("Pro starší Kindle k přímému nahrání").
- Prodejní formulář nahrává všechny podoby najednou, zapadá do nového průvodce v krocích.
- Send to Kindle i čtečka v prohlížeči si berou EPUB, ne první soubor v pořadí.
h3. 4. Import do katalogu (bin/pierot_import.php)
Z hotových souborů a popisu knihy založí produkt toutéž cestou, kterou jde prodejní formulář; obálku vytáhne z EPUBu. Sazbu každého souboru přečte ze souboru samotného.
h3. 5. Bezpečnost uploadu (prověřeno)
Odmítnuto: PHP skript s příponou .epub, podvržený ZIP, tmp_name mířící na soubor serveru, dvojitá přípona, soubor přes 50 MB, traversal v parametru, cizí nárok, stahování bez přihlášení. Nalezeny a opraveny dvě skutečné chyby:
- redirect_downloader maže celý pub/ při každém stažení (souběžná stahování si berou symlinky, výsledkem je 404) a vydává soubor pod odkazem bez ověření. Knihovna teď streamuje sama.
- PHP zahodí POST přes post_max_size celý a formulář se tiše vrátil prázdný; teď to hlásí.
h3. 6. Infrastruktura
Limity uploadu zvednuty na 64M/80M per-pool (ne globálně, na strojích běží cizí weby) na dev, virtual (produkce) a minifaidros (admin). Původní konfigurace zazálohovány, ověřeno php-fpm -t a reload.
h3. Odkazy
- Commity: 1974f932, 02408598, 924affb6, 3f18aed3, 7d3221f0
- Dodané soubory zákazníkovi: ~/git/pierot (reflow, faksimile s dvoustranami, kombinovaná verze, v původních i open-source písmech, plus AZW3/MOBI)
- Nasazení na produkci řeší jiný agent