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ší situaciDoporučené postupydůvod
Výsledkem extrakce je plný barevný obdélník a průhledná oblast se změní na černou nebo bílouZkontrolujte, zda je smask_xref 0 a sloučte SMask jako alfa kanál do hlavního obrazuSní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 plochyTransformační matice může obsahovat záporné měřítko nebo nerovnoměrné transformace
Extrakce byla úspěšná, ale stránka není vidětDotaz na stav OCG a porovnání s CropBoxemObrá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é souboryPů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ěryExtrahujte původní objekt přímoVýsledky vykreslování stránky
Získejte obsahPůvodní díly ve skladu zdrojů, jako je hlavní tok obrázkůVizuální efekty po zpracování instrukcemi syntézy
průhlednostHlavní 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 rozsahMůže být základní mapa v plné velikostiOmezeno CTM,/BBox a ořezovými cestami
Situace opětovného použitíStejnou základní mapu může sdílet více stránekKaž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 jevyMožné důvodyRozhodová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řiloZkontrolujte asociaci SMask; zkuste záložní barevný prostorPo 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 transformaciPřečtěte si parametry matice pro geometrickou korekciText 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ázkuObkladový vzor nebo pruhované úložištěŘez nebo spoj podle souřadnic BboxSpá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 plodinyFiltr stavu dotazu OCG; porovnejte CropBoxSlož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ímZaznamenat metadata DPI, označit jako nízkou kvalituKlíč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í

Aktualizováno 2026-11-13