Vytváření náhledu z PDF souboru
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.
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 !!!
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
Komentáře
Přehled komentářů
Tato zpráva je zde zveřejněna pomocí programu XRumer + XEvil 4.0
XEvil 4.0 je revoluční aplikace, která může obejít téměř veškerou ochranu proti botnetu.
Captcha Rozpoznávání Google (ReCaptcha-1, ReCaptcha-2), Facebook, Yandex, VKontakte, Captcha Com a více než 8,4 milionu dalších typů!
Četl jste to - to znamená, že to funguje! ;)
Podrobnosti na oficiálních stránkách XEvil.Net, je bezplatná demo verze.
All internet will be CRASHED with XEvil!?
(Mashafoula, 13. 12. 2017 13:39)