Inhaltsverzeichnis

23.12.5 Projekt PDF-Reader

In diesem Kapitel wird ein erprobtes Projekt vorgestellt. Es ermöglicht die Auswahl und Anzeige einer PDF-Datei. Das Projekt nutzt die Komponente gb.poppler.

Das Projekt 'PDF-Reader' verfügt über folgende Funktionalität:

BILD1

Abbildung 23.12.5.1: Programm-Oberfläche PDF-Reader mit Suchtext

BILD2

Abbildung 23.12.5.2: Programm-Oberfläche mit Anzeige der Fundstellen-Koordinaten

BILD3

Abbildung 23.12.5.3: Programm-Oberfläche mit Anzeige von Eigenschaften des PDF-Dokumentes

23.12.5.1 Quelltext (Auszüge) zum Projekt PDF-Reader

Das Projekt konzentrierte sich auf die Untersuchung der Gambas-Komponente gb.poppler. Es half, Fehler und Unzulänglichkeiten dieser neuen Komponente zu beheben, die die veraltete Komponente gb.pdf ersetzt. Das vorgestellte Projekt ist weit davon entfernt, ein vollständiger PDF-Betrachter zu sein. Es kann jedoch bei der ersten Arbeit mit der Komponente hilfreich sein.

Der Projekt-Quelltext ist für jedermann und für jede Art der Nutzung frei verfügbar.

BILD4

Abbildung 23.12.5.1.1: Programm-Oberfläche mit dualer Navigation

Die Navigation durch die einzelnen Seiten des Dokuments erfolgt über eine Thumbnail-Auswahl (A) oder über eine Auswahl aus dem Inhaltsverzeichnis (B) – falls es vorhanden ist. Falls kein Inhaltsverzeichnis vorhanden ist, besteht der Inhalt der ComboBox nur aus einem Eintrag für die Thumbnail-Auswahl (A) – siehe Abbildung 23.12.5.1 Programm-Oberfläche PDF-Reader mit Suchtext. Wenn die PDF-Datei bereits Thumbnails enthält, werden diese anstelle der selbst generierten Thumbnails angezeigt, was in der Regel schneller ist.

Das Projekt enthält spezielle PDF-Dateien, die zu Test- und Demonstrationszwecken über den Dateiauswahldialog geladen werden können.

Im folgenden Abschnitt werden die Navigation im PDF-Dokument über ein Inhaltsverzeichnis und die Navigation über Thumbnails vorgestellt:

    [1] Public Sub LoadPdf(PdfDocPath As String, Optional ExpandParent As Boolean = False)
    [2]
    [3]     FMain.Caption = ("PDF-File: ") & File.Name(pdfDocPath)
    [4]
    [5]     hPdfDocument = Null
    [6]     Try hPdfDocument = New PdfDocument(PdfDocPath)
    [7]
    [8]     If Error Then
    [9]        Message.Error("Couldn't load file.")
    [10]        Return
    [11]     Endif
    [12]
    [13]     hPdfDocument.Antialiasing = True         '-- Use Antialiasing
    [14]     hPdfDocument.textAntialiasing = True     '-- Use Antialiasing for text
    [15]     DocumentView1.Column = 1                 '-- To initially display a page at full width
    [16]     DocumentView1.Count = hPdfDocument.Count
    [17] '-- Because DocumentView1.Count = hPdfDocument.Count draws the document only at the first
    [18]     DocumentView1.Refresh()
    [19]
    [20]     CreateThumbnails()
    [21]     ShowIndex(True)
    [22]
    [23]
    [24] End

Kommentar

Quelltext CreateThumbnails():

    [1] Public Sub CreateThumbnails()
    [2]
    [3]     Dim hImage, hThumbnail As New Image
    [4]     Dim i As Integer
    [5]     Dim fFactor As Float = 0.10
    [6]
    [7]     ListViewPages.Expand = True
    [8]     ListViewPages.Clear()
    [9]
    [10]     For i = 0 To hPdfDocument.Max
    [11]     '-- Try reading embedded thumbnails first
    [12]         hThumbnail = hPdfDocument[i].Thumbnail
    [13]     '-- Make a thumbnail if no embedded thumbnail is available
    [14]         If IsNull(hThumbnail) Then
    [15]             hImage = hPdfDocument[i].Render(,,,,, 10)
    [16]             hThumbnail = hImage.Stretch(hPdfDocument[i].W * fFactor, hPdfDocument[i].H * fFactor)
    [17]         End If
    [18]         Paint.Begin(hThumbnail)
    [19]            Paint.LineWidth = 1
    [20]            Paint.Brush = Paint.Color(color.Black)
    [21]            Paint.Rectangle(0, 0, hThumbnail.W, hThumbnail.H)
    [22]            Paint.Stroke()
    [23]         Paint.End()
    [24]
    [25]     '-- Label instead of index+1, because the page labels of PDFs can be changed.
    [26]     '-- XViewer also shows the page label.
    [27]         ListViewPages.Add(i, hPdfDocument[i].Label, hThumbnail.Picture)
    [28]     Next
    [29]
    [30]     ListViewPages[0].Selected = True
    [31]
    [32] End

Quelltext ShowIndex(Optional ExpandParent As Boolean = False)

    [1] Public Sub ShowIndex(Optional ExpandParent As Boolean = False)
    [2]
    [3]     Dim hPdfIndex As PdfIndex
    [4]     Dim i, iLastParent As Integer
    [5]     Dim sIndexText As String
    [6]
    [7]     Dim pic, hpic As Picture
    [8]
    [9]     TreeViewIndex.Expand = True
    [10]     TreeViewIndex.Clear()
    [11]
    [12]     cCollection.Clear()
    [13]
    [14] '-- Load TreeView with table of contents
    [15]     If hPdfDocument.Index.Count > 0 Then
    [16]        ComboBoxSelectMode.Clear()
    [17]        ComboBoxSelectMode.Add("Index & Thumbnail")
    [18]        ComboBoxSelectMode.Add("Thumbnail")
    [19]        ComboBoxSelectMode.Add("Index")
    [20]        ComboBoxSelectMode.Index = 0
    [21]        TreeViewIndex.Visible = True
    [22]        For Each hPdfIndex In hPdfDocument.Index
    [23]            sIndexText = Trim(hPdfIndex.Text)
    [24]            hpic = Null
    [25]        '-- Dummy picture (required to use the paint methods)
    [26]            hpic = New Picture(1, 1)
    [27]            Paint.Begin(hpic)
    [28]              Paint.Font = TreeViewIndex.font
    [29]              pic = Null
    [30]          '-- Generate an invisible pic which enlarges the treeview line if required
    [31]              pic = New Picture(1, Paint.TextSize(sIndexText).H, True)
    [32]            Paint.End()
    [33]
    [34]        '-- Root item?
    [35]            If hPdfIndex.Parent = -1 Then
    [36]               TreeViewIndex.Add(i, sIndexText, pic)
    [37]               iLastParent = i
    [38]           '-- Expand the node
    [39]               TreeViewIndex[i].Expanded = ExpandParent
    [40]        '-- Non-Root parent item?
    [41]            Else If hPdfIndex.Children > 0 Then
    [42]               TreeViewIndex.Add(i, sIndexText, pic, hPdfIndex.Parent)
    [43]               iLastParent = i
    [44]               TreeViewIndex[i].Expanded = ExpandParent  '-- Expand the node ...
    [45]            Else                                         '-- Child item?
    [46]               TreeViewIndex.Add(i, sIndexText, pic, iLastParent)
    [47]            Endif
    [48]        '-- Put it into a collection to make the page accessable from the treeview
    [49]            cCollection.Add(hPdfIndex.Action.Goto.Page, i)
    [50]            Inc i
    [51]        Next
    [52]     Else
    [53]        ComboBoxSelectMode.Clear()
    [54]        ComboBoxSelectMode.Add("Thumbnail")
    [55]        ComboBoxSelectMode.Index = 0
    [56]        TreeViewIndex.Visible = False
    [57]     Endif
    [58]
    [59] End

Die folgenden zwei Ereignisbehandlungsroutinen vervollständigen die Navigation und bieten die Möglichkeit, eine bestimmte PDF-Seite in der DocumentView anzuzeigen:

    [1] Public Sub TreeViewIndex_Click()
    [2]
    [3]   DocumentView1.Goto(cCollection[TreeViewIndex.Current.Key] - 1)
    [4]   iFirstVisiblePage = cCollection[TreeViewIndex.Current.Key] - 1
    [5]
    [6] End
    [7]
    [8] ...
    [9]
    [10] Public Sub ListViewPages_Select()
    [11]
    [12]    DocumentView1.Goto(ListViewPages.Current.Key)
    [13]
    [14] End

Im Download-Bereich finden Sie den Quelltext des PDF-Reader-Projekts als Quelltext-Archiv sowie Beispiel-PDF-Dateien.

Download