Microsoft openXML dokumentumok - zip vagy nem zip?

A Microsoft openXML dokumentumok (pl. docx, pptx, stb) elméletileg szöveges, XML formátumú állományok adott struktúrába szervezve, majd zippel betömörítve.

Erről nagyon egyszerűen meggyőződhetünk, csak csapjunk hozzá egy .zip kiterjesztést (valami.pptx -> valami.pptx.zip), és máris elénk tárul a dokumentum belső szerkezete. Akár ki is tömöríthetjük, módosíthatjuk, persze ügyelve arra, hogy az XML valid maradjon, visszacsomagolva és visszanevezve ugyanúgy megnyitható az adott office alkalmazásban.

Vagyis... nem egészen. Ha kicsomagolok egy állományt, szerkesztem, majd Copy - Paste vissza a zipbe, akkor működik. Kicsomagolva, módosítva, majd zippel becsomagolva nem. Hibásnak jelzi a dokumentumot betöltéskor. Elment pár órám a teljesen valid XML szemmel parseolásával. Gondoltam, leírom, hátha más nem fog belefutni.

Hozzászólások

Most ránéztem friss fejjel is, és hát pebkac esete forog fönn. :))

A kicsomagoláskor az egész cuccot egy könyvtárba teszi, én pedig ezt csomagoltam be. Ha csak a belsejét csomagolom, akkor nekem is működik mindkét módon. Köszönöm a plusz információt!

Debian - The "What?!" starts not!
http://nyizsa.blogspot.com

Ha jól emlékszem, anno FAT12 fájlrendszert használtak a dokumentumfájlon belül, és abba raktak el mindent...

Fájlrendszer partíción van, fájlon belül max. képfájlban tudnám elképzelni. Az OpenXML-es formátumú fájlok lényegében zip fájlok, nem csak a MS-félék, hanem az OpenDocuemt Formatot használók is (OpenOffice.org, LibreOffice formátumai). Csak módosítva van a kiterjesztésük.

Gondolom azért zip, mert mindig is nyílt specifikációjú formátum volt, és a PKWare által szabadalmaztatott deflate (LZ77+Huffman) algoritmusra 2010-ben lejárt a 20 éves szabadalmi oltalmi idő, így már nem licencköteles, ténylegesen is szabad formátum, szerzői jog továbbra is védi, de csak a pkzip implementációt, de újraimplementálva specifikáció alapján lehet, és meg is tették (7-zip, infozip, gzip, zlib, stb.). Minden kezeli, minden platformon, nem túl komplex, gondolom ezért esett erre a választás.

A FAT is hasonló okokból népszerű, igaz ott a specifikáció nem nyílt, de reverse engineeringgel megfejtették, és a szabadalom lejárt róla. Nem a dokumentumformátumoknál alkalmazzák, hanem az UEFI/EFI-ban, meg több eszközben. Nem csak FAT12, hanem az összes válfaja, FAT16, FAT32.

A computer is like air conditioning – it becomes useless when you open Windows.” (Linus Torvalds)

igen a OLE2 formatum hasonlit nagyon a FAT-ra, de nem fat image, csak hasonlo a logikaja, szerkezete.

regi office (doc/xls/ppt) mellett sok egyeb MS cucc is ezt hasznalta, es van amit a mai napig ebbe raknak es ezt akar becsomagoljak a zip-alapu ujabb formatumukba...

    # OLE
    if d[0]==0xD0 and d[1]==0xCF and d[2]==0x11 and d[3]==0xE0 and d[4]==0xA1 and d[5]==0xB1:
        if ext in ["doc","xls","ppt","pps","pot","dot","xlt"]: return ext,T_DOC # ms office
        if ext in ["iam","idw","ipt","ipn","dft","par","asm","epf","psm","mxd","spp"]: return ext,T_CAD # Inventor, SolidEdge, EdgeCAM, ArcMAP, tecnomatix
        if ext in ["dlx","uld"]: return ext,T_CAD # https://www.dial.de/en/dialux/    cib dlc eld ltl m3d uld.
        if ext in ["pcbdoc","pcblib","schlib"]: return ext,T_CAD #.
        if ext in ["mpj","mtw"]: return ext,T_DB #  https://support.minitab.com/en-us/datasets/doe-data-sets/food-spoilage-…
        if ext in ["cfg","db"]: return ext,T_DB #  fixme???
        if ext=="msg": return ext,T_OLEMSG
        if ext=="suo": return ext,T_SRC # https://docs.microsoft.com/en-us/visualstudio/extensibility/internals/s…
        return "ole",T_OLE # D0 CF 11 E0 - A1 B1 1A E1

def parse_docxml(d):
        root=xml.etree.ElementTree.fromstring(d)
        for child in root:
            ct=child.attrib["ContentType"]
            if ct.lower()=="application/vnd.openxmlformats-officedocument.oleobject": return T_OLEX

Jó régóta használom így az Excel készítést, hogy az xmleket módosítom és szuperül működik. Két probléma esetén írja ezt az Excel, ha nem valid az xml, vagy a zip tartalmaz egy könyvtárat, és abban vannak az Excel fájlok. Még a böngésző felületén javascriptel összerakva is működik ezzel: https://github.com/Stuk/jszip