2016. január 3., vasárnap

PDF vízjelezése és JPEG-be mentése

A minap találkoztam egy olyan feladattal, hogy .NET környezetben kellett PDF-et kezelnem, többek között már létezőt vízjeleznem, illetve JPEG-be kimentem. Kifejezetten csak ingyenes eszközöket akartam használni, így több jelöltet is megvizsgáltam, hogy melyik mennyire teljesítené az elvárásaimat.


DynamicPDF
Moduláris, bizonyos részei nem csak .NET-en érhetők el, hanem JAVA és COM komponensként is. Hátránya, hogy az ingyenes verzió igaz, hogy korlátlan ideig és teljes értékűen használható, de a saját logójukkal vízjelezi a PDF fájlokat.

GhostScript.NET
A GhostScript alkalmazás köré készült .NET wrapper, emiatt a tényleges PostScript utasításokat kell illetve lehet megadni számára, például egy vízjelként használandó felirat illesztéséhez. Mivel csak egy wrapper, így telepítve kell lennie a GhostScriptnek.

PDFSharp
Ingyenes, nyílt forráskódú, de nem lehetséges képként menteni az egyes oldalakat, pusztán csak a PDF-ben található képeket tudja kimenteni.

Spire.NET
Minden elvárt feladatra alkalmas, viszont az ingyenes verzió csak 10 oldalt kezel.

Először a fentiek közül a GhostScript.NETet választottam a PostScript utasítások ellenére is, mivel az ingyenesség nem járt számomra zavaró korlátokkal. Szerencsére megkerülhető, hogy telepítve legyen a GhostScript, mivel elegendő, ha közvetlenül a DLL van betöltve:

var gvi = new Ghostscript.NET.GhostscriptVersionInfo(
                  new Version(0, 0, 0), 
                  Path.Combine(path,"gsdll32.dll"), 
                  string.Empty, 
                  Ghostscript.NET.GhostscriptLicense.GPL);


Számos példaprojekt létezik hozzá a projekt GitHub oldalán, például arra, hogy miként lehet JPEG-be menteni az egyes oldalakat, vagy esetleg vízjelet hozzáadni. Sajnos az ékezetes betűk okozta karakterkódolási problémát nem sikerült megoldanom. Emiatt mégsem használtam vízjelezésre a GhostScript.NET-et.

Megoldás

Végül kombináltam a GhostScript.NET és a PDFSharp eszközöket. Utóbbival könnyedén lehet vízjelezni ékezetes betűkkel is a PDF fájlokat és képes MemoryStreambe is menteni, amit a GhostScript.NET-nek át lehetett adni paraméterként. Összességében egy MemoryStreamekkel operáló pipeline-t készítettem.



Ti ismertek a fentieken kívül olyan ingyenes eszközt PDF létrehozására, módosítására, amivel lehetséges képbe exportálni, és nincs benne olyan korlátozás, ami befolyásolná az elkészült fájl minőségét (nem kívánt vízjel, limitált oldalszám, stb)? Szerintetek miként lehet GhostScript.NET-ben PostScript utasítással hozzáfűzni Windows-on az ékezetes betűket egy létező PDF dokumentumhoz?

6 megjegyzés:

  1. Érdekes meló így az év elejére:) .net alatt még nem csináltam ilyet (úgyhogy márcsak ezért is érdekes írás volt:). PHP-ban csináltam hasonlót,: végtelenül le egyszerűsítve: imagick convert-tel készítettem el a képeket pdf -> jpg. Majd a képeket utolag manipuláltam. Persze az akkori megoldásomat ma már másképp csinálnám, de alapvetően a lépéseken nem változtatnék mert az ImageMagick (ill. videós és/vagy audiós feladatoknál a ffmpeg) már sokszor bizonyult hasznosnak.

    VálaszTörlés
  2. Szemeztem az ImageMagick.NETtel is, de elvetettem, mivel az alapvetően képszerkesztésre való, én pedig a PDF irányból közelítettem, ez az irány valamivel logikusabbnak tűnt. Már csak azért is, mivel így megvan a lehetőségem, hogy a JPEG-esítést opcionálissá tehessem egy mozdulattal, minden további fejlesztés nélkül.

    Ettől függetlenül az is járható, ha a képre van illesztve a vízjel. Kicsit úgy érzem, hogy akkor alacsonyabb szinten kellene megvalósítanom a felirat transzformálását és illesztését.

    VálaszTörlés
  3. Szia Tibi!
    Én .NET-es pdf kezelésre az iTextSharp libet használtam többször sikeresen, ez a mai napig karbantartott open source lib, szóval nem hiszem hogy tartalmaz bármilyen korlátozást, viszont szerintem renderelni nem tud. Azt hiszem én is inkább több libből vadásztam volna össze a megoldást, így hangzik tutinak.

    VálaszTörlés
  4. Szia!
    Az iTextSharpnál én is arra jutottam, hogy nem tud renderelni. Másrészről az AGPL miatt nem kell open source lennie az én alkalmazásomnak is? Illetve, fizethetek is az iTextnek azért, hogy megtarthassam a kódom.

    VálaszTörlés
  5. Igazad van, az AGPL elég sok megkötést tesz, de ha jól értettem, ameddig csak te használod ("te" lehet egyenlő pl egy egész cég belső elérésével), addig nem kell közzé tenni. Illetve csak újabban álltak át AGPL-re, régebbi verzióknak ilyen szempontból barátságosabb a licensze.

    VálaszTörlés
  6. Jogos, csak akkor kell fizetni nekik/megosztani a kódot, hogy ha árulni szeretném az appot.

    VálaszTörlés