Share via


Arculatváltás és Open XML

Tegyük fel, hogy egy vállalat/szervezet úgy dönt, itt az ideje a régi, poros, unásig ismert imázs leváltásának. Új név, új logó, új jelmondat: remek lehetőség az udvari nyomdának és webfejlesztőnek, de komoly fejfájás az ügyfélszolgálatnak és az IT-nek.

Én most az utóbbi csapatnál maradnék: tegyük fel, hogy le kellene cserélniük az eddigi logót a cég valamennyi meglévő irodai dokumentumában, és arról is gondoskodniuk kéne, hogy mostantól csak az új fejléccel készülhessenek anyagok. Ezt a nem éppen irigylésre méltó feladatot leegyszerűsíti az Open XML dokumentumformátum, valamint az ehhez készült SDK (amely jelenleg "preview" állapotban van, valószínűleg az ISO-szabványosítás folyamatának lezárultáig).

Amikor egy DOCX dokumentumot ZIP-pé nevezünk át, és belenézünk a belsejébe, könnyedén megtalálhatjuk a beszúrt képeket:

image

Ezt a képet (pl. a logót) kézzel is könnyedén lecserélhetjük: húzzuk be a ZIP megfelelő mappájába (a word/media nevűbe) az új képfájlt, töröljük a régit, és nevezzük át az újat. Négy-öt dokumentumig ez még élvezet, utána viszont jó lenne automatizálni a folyamatot.

ReplaceLogo.exe

MSDN-példa alapján átírtam egy ReplaceLogo nevű, parancssorból indítható alkalmazást, amely pont ezt teszi. Íme a teendők:

  1. Töltsük le az Open XML SDK-t erről a címről, és telepítsük.

  2. Hozzunk létre egy új konzolalkalmazást a Visual Studioban, ReplaceLogo néven. Én VB-ben írtam, de egyszerűen portolható C#-ra.

  3. Adjunk a projekthez egy új referenciát: a .NET fülön a Microsoft.Office.DocumentFormat.OpenXML bejegyzést keressük.

  4. A modul tetején hivatkozzuk meg ezt és a System.IO-t.

    Imports _
    Microsoft.Office.DocumentFormat.OpenXml.Packaging
    Imports System.IO

  5. Bővítsük ki a Main eljárást: ellenőrizzük a parancssori paraméterek számát, és ha nem kettőt kapunk, írjuk ki a helyes használat mikéntjét.

    Sub Main(ByVal CmdArgs() As String)
    If CmdArgs.Length = 2 Then
    ReplaceImage(CmdArgs(0), CmdArgs(1))
    Else
    Console.WriteLine _
    ("Használat: Replacelogo <dokumentum> <kép>" _
    ", pl. ReplaceLogo Dok1.docx Kép.jpeg")
    End If
    End Sub

  6. Készítsük el az eljárást, amely a megadott dokumentumban kicseréli az első képet a megadottra.

    Public Sub ReplaceImage(ByVal documentFile As String, _
    ByVal imageFile As String)
    Dim wordDoc As WordprocessingDocument = _
    WordprocessingDocument.Open(documentFile, True)
    Dim mainPart As MainDocumentPart = _
    wordDoc.MainDocumentPart
    Dim imagePart As ImagePart = mainPart.ImageParts(0)
    Dim stream As FileStream = New FileStream _
    (imageFile, FileMode.Open)
    imagePart.FeedData(stream)
    End Sub

  7. Látható, hogy a kód rendkívül egyszerű: megnyitunk egy új Wordprocessing dokumentumot, vesszük a fő részét (a tényleges dokumentumot), majd az abban található első képet, és lecseréljük a fájl alapján.

Készen is vagyunk, kipróbálhatjuk az alkalmazást! Készítsünk két képfájlt (pl. Logo1.jpeg, Logo2.jpeg) és egy Word 2007 dokumentumot (Doksi.docx). A dokumentumba szúrjuk be a Logo1 nevű képet, majd mentsük el.

A dokumentumot és a képeket tartalmazó mappában nyissunk egy parancsablakot, majd adjuk ki a következő parancsot:

ReplaceLogo Doksi.docx Logo2.jpeg

Nyissuk meg a dokumentumot, és ha mindent jól csináltunk, már az új logó fogja díszíteni!

Ha több dokumentumot kell hasonlóképpen módosítanunk, az alkalmazást használhatjuk ciklusban is. Készítsünk még néhány Word doksit az előzőekben leírtak szerint, majd adjuk ki a következő parancsot:

for %f in (*.do?x) do ReplaceLogo %f Logo2.jpeg

Így egyetlen lépésben lecserélhetjük az összes dokumentum logóját. Nem véletlen, hogy DOCX helyett DO?X-et írtam a parancssorban: ha esetleg DOTX sablon alapján készítettük a dokumentumainkat, egy füst alatt azzal is elbánhatunk.