Jdi na obsah Jdi na menu
Reklama
Založte webové stránky zdarma - eStránky.cz
 


Vytváření náhledu z PDF souboru

16. 2. 2011

Před časem jsem byl požádán zda bych nevytvořil náhled pdf souboru a tento náhled poté zobrazil na formuláři z důvodu jednodušší identifikace výrobku. S PDF soubory jsem doposud nikdy - pomocí VBA - nepracoval, takže sem hned žhavil strýčka Gůgle a žádal ho o radu popř. o celé hotové řešení a opravdu sem byl úspěšný - alespoň na první pohled - některé řešení sice využívaly placenou verzi knihovny od Adobe , ale také sem našel řešení založené na volně dostupné knihovně Adobe Acrobat (Acropdf1) kterou získáte po instalaci Adobe Reader. Dále se na internetu objevují knihovny od jiných poskytovatelů, které suplují Adobe Reader, ale tyto sem nezkoušel. Testoval sem tedy pouze volně dostupnou knihovnu od Adobe a během používaní sem zjistil zásadní nedostatky, které toto řešení učinily nedostatečné. Proto sem hledal dále a našel C# projekt, který používá volně dostupný nástroj GhostScript pro vytvoření náhledu z PDF souboru. Bohužel, tento projekt nemůže být použit rovnou z VBA. Čtěte dále k rozlousknutí tohoto omezení.

Jak sem zmínil výše, testoval sem pouze Acropdf1 knihovnu od Adobe.

Acropdf1.PNG, 35kB

Jak přidat Acropdf1 activeX na formulář VBA

Z počátku se zdál tento prvek jako skvělé řešení - umožňuje rolování, zvětšování i přímý tisk, ale pak sem musel čelit dvěma nedostatkům. Ten první je zcela zásadní a degradoval celý prvek na nepoužitelný paskvil. Pokud má tento prvek fokus = je zaměřen na formuláři a uživatel stiskne klávesu TAB celá aplikace Excel okamžitě padá a musí být restartována pomoci CTRL+ALT+DELETE. Tato chyba je velice známá , ale Adobe ji prostě neumí opravit, i když se o to už několikrát pokusili. A druhá chyba, lépe řečeno chování, je spíše "nepříjemnosti", ovládací prvek si při načtení PDF souboru převezme fokus a už jej nikdy nevrátí zpět, třebaže si to zkoušíte vynutit silou. Ono to nevypadá až tak strašně, ale asi pochopíte, že klient si na výše uvedené nedostatky značně stěžoval a aplikaci považoval za nefungující. Proto sem začal pracovat na jiném řešení.

Jak sem psal v anotaci článku, našel sem kód od Matthew Ephraim. které používá volně dostupný nástroj Ghostscrip , .NetFramework 3.5 a je napsán v C#, pro vytváření náhledu z PDF souborů. Přímo z Visual Studia nenastal vůbec žádný problém s použití jeho kódu, vše pracovalo skvěle. Bohužel VBA už na tom tak dobře není. Vzhledem k výše popsaným těžkostem s acropdf1 jsem se pustil do úpravy kódu v C#. Udělal jsem pouze minimální úpravy, které zpřístupňují C# knihovnu objektovému modelu VBA.
Nyní - po registraci knihovny do Vašeho systému - můžete jednoduše přiřadit referenci a začít používat!!! A pracuje to opravdu skvěle !!!

GhostScriptSharp_reference.PNG, 17kB

Pro ty, které zajímá jak udělat knihovnu v .NetFrameworku tak aby byla použitelná z VBA jsem přidal kompletní projekt s celým popisem jak na to. Koukněte do sekce přílohy.
A pro ty, kdo chce hned vytvářet náhledy z PDF souborů, jsem připravil instalátor. Opět koukněte do sekce přílohy. Stačí stáhnout a nainstalovat. Instalátor zkontroluje zda máte nainstalovaný .NetFramework 4 a pokud ne, tak Vám nabídne stažení a poté jen zaregistruje knihovny (jednu knihovnu pro Ghostscript a jednu mou knihovnu) do Vašeho systému a otevře složku s ukázkou použití.

Váš kód pro práci s knihovnou může vypadat třeba takto

Option Explicit
'********************************************************************************
'TestPDFThumbnailGeneration
'
' Purpose:  It uses reference to GhostscriptWrapper library.
'           From a PDF file creates a jpg file that represents a thumbnail of the PDF.
'           You can set page number and DPI quality.
'
' Inputs:   -none-
'
' Outputs:  -none-
'
' Created:  02/10/2011  Premysl Lazecky
'
' Modified: .
'
'********************************************************************************
Sub TestPDFThumbnailGeneration()

    Dim PDF             As GhostscriptWrapper
    Dim strPath         As String
    Dim strInputFile    As String
    
    strInputFile = "Test.PDF"
    strPath = ActiveWorkbook.Path
    If Right$(strPath, 1) <> Application.PathSeparator Then
       strPath = strPath & Application.PathSeparator
    End If
    
    Set PDF = New GhostscriptWrapper
    
    PDF.GeneratePDFThumb inputPath:=strPath & strInputFile, _
                         outputPath:=strPath & "Output.jpg", _
                         Page:=1, _
                         Width:=72, Height:=72
    
        
    Set PDF = Nothing
        
End Sub

Jako výsledek tohoto kódu dostanete jpg soubor s názvem Output.jpg s náhledem zvolené stránky pdf souboru - v tomto případě strany jedna - v definovaném rozlišení - horizontalní a vertikálním - zde 72 dpi.

Přílohy

Instalátor s příkladem

C# projekt

 

 

Komentáře

Přidat komentář

Přehled komentářů

Zatím nebyl vložen žádný komentář