HTML naar PDF
- 11/11/2011
Voorbeeldbestanden bij dit artikel: | |
Inleiding
Gezien de lengte van een aantal van de Excel en TM1 artikels op mijn website, overdacht ik of het handiger en nuttiger zou zijn om dit in te krimpen. Geen nood, ik ga niet drastisch snoeien in de informatie die ik verspreid! Neen, eerder dacht ik eraan om het artikel enkel een korte samenvatting te zijn, en een PDF-bestand ter beschikking te stellen met het volledige artikel. De lezer kan dan kiezen om dat PDF-bestand te downloaden op basis van de korte samenvatting. Of gewoon doorgaan naar een ander artikel.
PDF-bestanden op zich hebben wel degelijk voordelen boven de HTML-variant, maar ook nadelen. Het belangrijkste nadeel is dat ze statisch zijn, en opnieuw gegenereerd moeten worden als ik een artikel aanpas. Daarbij komt dat de artikels en andere HTML bestanden allemaal eerst als PDF geconverteerd moeten worden. Met bijna 200 pagina′s op de website zag ik het niet zitten om dit manueel te doen.
VBA-code
Ik heb op internet gezocht naar tooltjes, maar kwam van een kale reis terug. Vaak zal de software een watermark plaatsen in het PDF-document; dit wil ik vermijden. Of is de software slechts te gebruiken voor een beperkte proefperiode.
Ik heb dan zelf een routine in Word VBA geschreven, die:
- alle .htm bestanden in een folder zal afgaan
- het bestand openen in Word
- bepaalde extra handelingen uitvoeren, zoals een paginanummering toevoegen
- opslaan als PDF
- het bestand weer sluiten
Hier is werkende voorbeeldcode voor Word 2007:
Const FolderName As String = "D:\Personal Wim\Website\" Const sPathOutput As String = "D:\Personal Wim\Website\PDF files\" Const sPathInputWeb As String = "http://users.skynet.be/fa436118/wim/"Sub MAIN()' Wim Gielis ' https://www.wimgielis.com''''' ' Word VBA code to convert HTM files to PDF files ' 11/11/11 '''''On Error GoTo ErH s = Timer 'converteer de verschillende htm files FName = Dir(FolderName & "*.htm") Do While Len(FName) HTMLtoPDF FolderName & FName FName = Dir() Loop MsgBox "Klaar." & vbCr & "(in " & Format((Timer - s) / 86400, "mm:ss") & ")", vbInformation, "Status" Exit Sub ErH: MsgBox "Error " & Err.Number & ":" & vbNewLine & Err.Description, vbCritical, "Onverwachte foutmelding"End Sub
Dit is de procedure die je moet uitvoeren. Het bevat de lus doorheen de .htm bestanden. Voor elk bestand spreken we de procedure HTMLtoPDF aan, waarvan ik de code nu afdruk:
Private Sub HTMLtoPDF(sFile As String)Dim Para As Paragraph With Documents.Open(sFile) For Each Para In .Paragraphs 'custom code om bepaalde paragrafen te bewerken of verwijderen Next 'voeg aan het einde van het document jaartallen toe With .Parent.Selection .EndKey 6, 0 .TypeText "2004-2012" End With 'bewerk de links For Each myLink In .Hyperlinks If Left(myLink.Address, 7) <> "http://" And Left(myLink.Address, 7) <> "mailto:" Then myLink.Address = sPathInputWeb & Replace(myLink.Address, "\", "/") End If Next 'voeg paginanummering toe .Sections(.Sections.Count).Footers(wdHeaderFooterPrimary).Range.Select With Selection .Paragraphs(1).Alignment = wdAlignParagraphCenter .Paragraphs(1).Range.Font.Size = 8 .TypeText Text:="p. " .Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:="PAGE ", PreserveFormatting:=True .TypeText Text:="/" .Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, Text:="NUMPAGES ", PreserveFormatting:=True End With 'de bestandsnaam bepalen sOutputFile = Replace(Replace(sFile, FolderName, sPathOutput), ".htm", ".pdf") If CreateObject("Scripting.FileSystemObject").FileExists(sOutputFile) Then Kill sOutputFile 'converteer naar PDF .ExportAsFixedFormat sOutputFile, wdExportFormatPDF '(alternatief: .SaveAs sOutputFile, 17) .Close 0 End WithEnd Sub
Ik ben er nog niet uit of ik PDF files ga aanbieden op de site, of dat ik het houd op de huidige manier van werken. Als jullie voorstellen hebben, dan verneem ik die graag via email.