Proč se obrázky vyjmuté z PDF liší od obrázků na stránce?
Snímky s průhledností lze uložit samostatně jako hlavní obrázek a měkkou masku. Dále použijte Pillow k vytvoření RGBA PNG, vložte do paměti PDF a zhodnoťte hlavní obrázek a SMask. Extrahování bajtů hlavního obrázku se nerovná získání úplného efektu průhlednosti ani se nerovná rekonstrukci všech instancí zobrazení na stránce.
Obrázky, které extrahujete z PDF, často vypadají jinak, než co vidíte na stránce: jsou buď úplně černé, mají špatnou velikost, nebo jim chybí pozadí či vodoznaky. Problém většinou není v kódu samotném, ale v tom, že čtete původní obrázkový objekt uvnitř PDF a při vykreslování stránky vám chybí instrukce ke složení.
Tento článek je napsán pro vývojáře a zpracovatele dokumentů, kteří potřebují k analýze obrázků PDF používat skripty. Je vhodný pro scénáře, jako je předzpracování OCR a reorganizace obsahu. Po přečtení pochopíte rozdíl mezi původním objektem a zobrazením stránky, víte, proč SMask (měkká maska) způsobuje ztrátu průhledných oblastí, a zvládnete sadu metod autotestu pomocí syntetických vzorků.
Tento článek používá syntetické vzorky k demonstraci metody zpracování. Kód byl zkontrolován s příklady v izolovaném prostředí a není zárukou všech skutečných souborů nebo výkonu produktu. Před zpracováním důležitých dokumentů si prosím uschovejte originály a zkontrolujte je podle hranic a přejímacích položek v textu.
Výsledky extrakce obrázků PDF nejsou konzistentní se stránkou? Závěr jednou větou
Extrahované bajty hlavního obrázku se nerovnají úplnému účinku na stránku. Současně je třeba zpracovat SMask a jako měřítko přijetí se použije skutečný výsledek vykreslování čtečky.
| vaší situaci | Doporučené postupy | důvod |
|---|---|---|
| Výsledkem extrakce je plný barevný obdélník a průhledná oblast se změní na černou nebo bílou | Zkontrolujte, zda je smask_xref 0 a sloučte SMask jako alfa kanál do hlavního obrazu | Snímky s průhledností lze uložit samostatně jako hlavní obrázek a měkkou masku. Extrahováním pouze hlavního obrázku ztratíte informace o průhlednosti. |
| Extrahuje se celý velký obrázek a na stránce se zobrazí pouze jeho část. | Přečtěte matici CTM a /BBox, ořízněte podle oblasti zobrazení | Stejnou podkladovou mapu může znovu použít více stránek a každá stránka zobrazuje pouze svou částečnou oblast. |
| Orientace obrazu je obrácená nebo deformovaná | Přečtěte si parametry matice pro geometrickou korekci a ručně zkontrolujte text a plochy | Transformační matice může obsahovat záporné měřítko nebo nerovnoměrné transformace |
| Extrakce byla úspěšná, ale stránka není vidět | Dotaz na stav OCG a porovnání s CropBoxem | Obrázek může být skryt volitelnou skupinou obsahu nebo mimo oblast oříznutí |
| Obrázek je rozmazaný nebo má nízké rozlišení | Zaznamenejte metadata DPI a označte jako nízkou kvalitu, v případě potřeby znovu naskenujte zdrojové soubory | Původní vložený obrázek může být miniaturou s nízkým rozlišením |
Rozdíl mezi původními objekty a vykreslovacími kanály
Soubory PDF jsou strukturovány jako sklad zdrojů. `Document.extract_image(xref)` Tato metoda umožňuje odebrat díly ze skladu tak, jak jsou. Zobrazení na stránce také musí projít několika procesy: změna měřítka transformační matice (CTM), oříznutí ořezové cesty (Clip Path), míchání skupiny průhlednosti (Transparency Group) a překrytí měkké masky (Soft Mask).
Nejtypičtější rozdíl pochází od SMask. Mnoho PNG s kanálem průhlednosti je uvnitř PDF rozděleno na dvě části: obrazový proud RGB a samostatný proud šedé masky. Pokud vyjmete pouze hlavní obrázek a zahodíte přidružený objekt SMask, získáte obdélník bez průhlednosti a původně průhledná oblast bude černá nebo bílá.
Navíc, aby se ušetřil objem, může být stejná základní mapa s vysokým rozlišením znovu použita na více stránkách a každá stránka zobrazuje pouze její část prostřednictvím různých /BBox a matic. Přímá extrakce bude mít za následek celý velký obrázek, nikoli oříznuté fragmenty, které uživatel vidí. Toto „to, co vidíte, není to, co dostanete"je inherentní charakteristikou PDF jako výměnného formátu a není chybou knihovny pro analýzu.
Následující tabulka porovnává tyto dva pohledy:
📊 Srovnání jádra
| Kontrastní rozměry | Extrahujte původní objekt přímo | Výsledky vykreslování stránky |
|---|---|---|
| Získejte obsah | Původní díly ve skladu zdrojů, jako je hlavní tok obrázků | Vizuální efekty po zpracování instrukcemi syntézy |
| průhlednost | Hlavní obrázek a SMask mohou být uloženy odděleně a je třeba je ručně přiřadit. | Měkké masky se překrývají a průhledné oblasti se zobrazují normálně. |
| Velikost a rozsah | Může být základní mapa v plné velikosti | Omezeno CTM,/BBox a ořezovými cestami |
| Situace opětovného použití | Stejnou základní mapu může sdílet více stránek | Každá stránka představuje pouze svou část |
Syntetické testovací prostředí a zpracování hraničních případů
Aby bylo možné ověřit logiku extrakce bez spoléhání se na externí soubory, je třeba sestavit syntetické PDF obsahující SMask. Následující kód používá PyMuPDF k vytvoření testovacího dokumentu v paměti, ve kterém má objekt obrázku nezávislou měkkou masku, simulující situaci ve skutečné scéně, kde „ikona má průhledné pozadí, ale podkladová vrstva je uložena v samostatném proudu".
from io import BytesIO
from PIL import Image
import pymupdf
im = Image.new("RGBA", (16, 16), (255, 0, 0, 128))
raw = BytesIO()
im.save(raw, format="PNG")
with pymupdf.open() as doc:
page = doc.new_page(width=100, height=100)
page.insert_image(pymupdf.Rect(10, 10, 70, 70), stream=raw.getvalue())
images = page.get_images(full=True)
assert len(images) == 1
xref, smask = images[0][:2]
assert xref > 0 and smask > 0
assert doc.extract_image(xref)["width"] == 16
assert doc.extract_image(smask)["image"]
Správné očekávání výstupu: Program by měl být schopen rozpoznat, že obrázek je spojen s SMask, a úspěšně extrahovat data hlavního obrázku.
Kód je zcela samostatný a nevyžaduje žádné externí vstupní soubory. Syntetizuje PDF s SMask v paměti a poté ověří, že logika extrakce správně rozpoznává asociaci masky. Kód obsahuje dvě klíčová tvrzení: jedno, které ověřuje integritu extrahovaných dat, a druhé, které ověřuje povědomí o stavu spojeném s SMask.
Tento kód se zaměřuje na ověření integrity na úrovni metadat. Pokud se ve skutečné produkci použije smask_xref != 0, je třeba použít knihovny, jako je Pillow, k vložení výsledku doc.extract_image(smask_xref) do hlavního obrazu jako alfa kanál. Tato dvě tvrzení pokrývají dvě základní smlouvy „data lze extrahovat"a „přidružení masky je viditelné", což může zabránit falešným úspěchům při prázdných dokumentech nebo změnách API.
Hranice přijímání výsledků extrakce a ruční kontroly
Automatická extrakce nemůže zcela nahradit vizuální potvrzení. Následující tabulka shrnuje běžné anomálie, strategie zacházení a situace, které musí být ponechány na lidském posouzení.
| Pozorovat jevy | Možné důvody | Rozhodování o automatizovaném zpracování | Podmínky spouštění ruční kontroly |
|---|---|---|---|
| Obraz je celý černý nebo celý bílý | SMask byl extrahován jako samostatný obrázek; dekódování barevného prostoru se nezdařilo | Zkontrolujte asociaci SMask; zkuste záložní barevný prostor | Po vrácení nelze obsah stále rozpoznat; přímé barvy nebo barvy související se zařízením |
| Orientace obrázku je obrácená nebo roztažená | Matice CTM obsahuje negativní škálování nebo nerovnoměrnou transformaci | Přečtěte si parametry matice pro geometrickou korekci | Text nebo plochy jsou po opravě zjevně zdeformované; složitá vektorová ořezová cesta |
| Více malých obrázků sloučených do jednoho velkého obrázku | Obkladový vzor nebo pruhované úložiště | Řez nebo spoj podle souřadnic Bbox | Spárovací mezera je zřejmá; logicky by mělo jít o nezávislou sémantickou jednotku |
| Extrakce byla úspěšná, ale stránka není viditelná | Skryto OCG (volitelná skupina obsahu); mimo oblast plodiny | Filtr stavu dotazu OCG; porovnejte CropBox | Složitá logika vrstvy, jako je vnořená OCMD; dynamická pole formuláře |
| Velmi nízké rozlišení nebo rozmazané | Původní vložení je miniatura s nízkým rozlišením | Zaznamenat metadata DPI, označit jako nízkou kvalitu | Klíčová grafika nebo text jsou nečitelné kvůli rozmazání; zdrojový dokument je třeba znovu naskenovat. |
Je třeba poznamenat, že „demonstrace kódu"pouze ověřuje konektivitu volání API a datových toků a neznamená, že end-to-end efekt je na úrovni. Když narazíte na vnořenou logiku OCG, vlastní shadery nebo šifrované dokumenty, výstup skriptu je pouze pro referenci a musí být akceptován proti skutečnému vykreslení čtečkou PDF.
🎯 Která metoda je pro vás vhodná?
Pokud potřebujete zachovat efekt průhlednosti
Nejprve zkontrolujte, zda existuje SMask, sloučte ji do alfa kanálu a poté proveďte následné zpracování.
Pokud potřebujete pouze částečný obrázek na stránce
Přečtěte si CTM a/BBox a ořízněte podle oblasti zobrazení místo přímého uložení základního obrázku.
Pokud je váš obrázek naskenovaný nebo vložený s nízkým rozlišením
Nejprve zaznamenejte metadata DPI a označte kvalitu. Pokud obsah klíče není jasný, vraťte se ke zdrojovému souboru a znovu naskenujte.
Pokud dokument obsahuje vrstvy, šifrování nebo složité oříznutí
Považujte výstup skriptu za předběžný výsledek a konečný efekt vykreslení ve čtečce PDF bude mít přednost.
❓ Často kladené otázky (FAQ)
1. Proč průhledná oblast extrahovaného obrázku zčerná?
Častým důvodem je, že informace o průhlednosti jsou uloženy v SMask a pouze hlavní obrázek je extrahován bez začlenění masky.
2. Extrahovaný obrázek je mnohem větší než to, co vidíte na stránce. co se děje?
Stejnou podkladovou mapu může znovu použít více stránek. Každá stránka zobrazuje pouze její část prostřednictvím /BBox a matice. Přímá extrakce bude mít za následek kompletní podkladovou mapu.
3. Kód projde. Znamená to, že extrahované výsledky lze přímo použít?
nemůže. Demonstrace kódu pouze ověřuje konektivitu volání API a datových toků a pro konečné přijetí je třeba použít skutečné výsledky vykreslování čtečky.
4. Extrakce byla úspěšná, ale obrázek na stránce není vidět. Jaký může být důvod?
Obrázek může být skryt volitelnou skupinou obsahu (OCG) nebo mimo oblast oříznutí. Stav OCG lze dotazovat a porovnávat s CropBoxem.
📝 Shrnutí
Původní obrazový objekt v PDF a efekt zobrazení stránky jsou dvě úrovně věcí a vztah mezi nimi musí být před extrakcí vyjasněn. Zpracujte SMask, matici a informace o oříznutí společně a použijte výsledky vykreslování k přijetí, aby byly výsledky spolehlivé.
Vyzkoušejte to hned: Nahrajte dokument a začněte překládat při zachování původního rozvržení


