pdfviewer — u_pbt_pdfviewer #
← Komponentenreferenz · Inhalt des Handbuchs
Integrierter PDF-Betrachter: zeigt ein lokales oder im Web veröffentlichtes Dokument direkt in Ihrem Fenster an, mit Seitennavigation, Zoom und Druckfunktion.
▶ Live ansehen — Demoanwendung, Kachel PDF viewer: die Vorschau, der zugehörige Code und diese Seite, nebeneinander.
Auf einen Blick #
| Userobject | u_pbt_pdfviewer |
| Item-Klasse | — (Komponente ohne Items) |
| Wofür | Eine Rechnung, eine Bestellung, einen Vertrag oder eine Anleitung anzeigen, ohne eine externe Anwendung zu starten |
| Opt-in-Optionen | — |
Die Komponente ersetzt das klassische „PDF in eine temporäre Datei speichern und dann ShellExecute aufrufen“: Das Dokument bleibt in Ihrer Anwendung, und der Benutzer verlässt nie den aktuellen Bildschirm.
Schnellstart #
// open-Event des Fensters : ein auf der Festplatte vorhandenes Dokument anzeigen
uo_pdf.is_source = "C:\factures\FA-2026-0142.pdf"
// ue_load_completed-Event von uo_pdf : (string as_source)
uo_status.of_panel(/*key*/ "main").is_text = "Dokument angezeigt"
Das ist alles: is_source zu setzen genügt, um das Dokument zu laden und anzuzeigen.
Eigenschaften #
| Eigenschaft | Typ | Standard | Zweck |
|---|---|---|---|
is_source | string | "" | Anzuzeigendes Dokument: ein Dateipfad (absolut, relativ zur Anwendung oder im Netzwerk; ein # gehört zum Namen), eine file:///-Adresse, eine Webadresse https://…, die als application/pdf ausgeliefert wird, oder eine data:application/pdf-Adresse. Das Setzen des Werts löst das Laden aus; "" zu setzen leert den Betrachter. Alles andere wird abgelehnt und über ue_load_failed gemeldet — auch http://. Wird so zurückgelesen, wie Sie es geschrieben haben |
ii_page | integer | 0 | Angezeigte Seite, ab 1 gezählt (0 = die erste Seite des Dokuments). Eine vor is_source gesetzte Seite gilt für dieses Dokument; sonst öffnet sich ein neues Dokument auf seiner ersten Seite. Jede Änderung lädt das Dokument neu und löst ue_load_completed erneut aus: Der Betrachter liest seine Seite nur beim Laden. Nur schreibend: Beim Auslesen erhalten Sie die zuletzt angeforderte Seite, nicht die angezeigte. Der Betrachter ist der der Web-Engine, und er meldet nichts zurück. |
ii_zoom | integer | 0 | Zoom in Prozent (0 = dem Betrachter überlassen). Ein gesetzter Zoom hebt is_fit auf, das ihm widerspricht. Nur schreibend, wie ii_page: Zoomt der Benutzer über die Leiste des Betrachters, folgt diese Eigenschaft nicht. |
is_fit | string | "" | Anpassung: FIT_PAGE, FIT_WIDTH, FIT_HEIGHT, oder "" für keine. Hebt ii_zoom auf |
ib_viewer_toolbar | boolean | true | Zeigt die eigene Leiste des Betrachters (Seitenzahl, Zoom, Drucken, Herunterladen). Blenden Sie sie aus, wenn Ihr Fenster diese Befehle selbst trägt |
ib_allow_save | boolean | true | Bietet die Befehle Speichern und Speichern unter der Leiste des Betrachters und seines Menüs an. Bei false wird das Dokument angezeigt, ohne anzubieten, eine Kopie zu speichern. Das ist kein Schutz: Die Datei bleibt auf der Festplatte lesbar. Jede Änderung lädt das angezeigte Dokument neu |
ib_allow_print | boolean | true | Bietet den Befehl Drucken der Leiste des Betrachters und seines Menüs an. of_print druckt weiterhin: Ihre Anwendung entscheidet. Jede Änderung lädt das angezeigte Dokument neu |
is_theme_style | string | "" | Visueller Stil der Komponente (Konstanten THEME_STYLE_*); leer = der der Anwendung, bei jeder Änderung übernommen |
is_theme_mode | string | "" | Helle oder dunkle Variante (Konstanten THEME_MODE_*); leer = die der Anwendung, bei jeder Änderung übernommen |
il_theme_accent | long | -1 | Akzentfarbe dieser Komponente (-1 = Akzent der Anwendung, sonst der des Designs) |
Methoden #
| Methode | Zweck |
|---|---|
of_refresh ( ) | Liest das aktuelle Dokument erneut (von der Festplatte oder aus dem Netzwerk), ohne die Einstellungen anzutasten: der Weg, eine am selben Pfad neu erzeugte Datei anzuzeigen. Die Scrollposition bleibt nicht erhalten: Der Betrachter beginnt wieder bei ii_page. Nach einem Fehlschlag wird dasselbe Dokument erneut versucht. Ein abgelehntes Dokument wird erneut beurteilt: ue_load_failed wird erneut ausgelöst. Gibt 0 zurück, sobald angefordert, -4 ohne Dokument (is_source leer), -2, wenn die Komponente nicht erstellt ist |
of_print ( ) · of_print (boolean) | Öffnet die Druckvorschau des Dokuments — nicht der Seite, die es umrahmt. Liefert 0, sobald die Vorschau angefordert ist, -4, wenn kein Dokument angezeigt wird, -2, wenn die Komponente nicht erstellt ist. Das Argument hat hier keine Wirkung: Es ist immer die Vorschau des PDF-Betrachters |
of_print_to_pdf (string) | Gibt bei dieser Komponente -4 zurück, ohne etwas zu schreiben: Die gedruckte Seite wäre nur der Rahmen des Betrachters, nie das Dokument. Das Dokument ist bereits ein PDF: Kopieren Sie die Datei von is_source |
of_reset ( ) | Leert den Betrachter und setzt alle Eigenschaften auf ihren Standard zurück. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist |
of_set_redraw (boolean) | Fasst eine Folge von Änderungen zu einer einzigen Darstellung zusammen. Liefert 0 nach der Anwendung, -2 wenn die Komponente nicht erzeugt ist |
of_save_as_png (string) · of_save_as_jpg (string) | Exportiert die Darstellung als Bild. Liefert 0 nach dem Schreiben des Bildes, -4 wenn das Schreiben fehlschlägt, -2 wenn die Komponente nicht erzeugt ist |
Events #
| Event | Ausgelöst wenn |
|---|---|
ue_load_completed (string as_source) | Das Dokument wird angezeigt; as_source ist is_source, so wie Sie es geschrieben haben. Wird auch durch of_refresh und jede Änderung von Seite, Zoom, Anpassung oder Betrachterleiste ausgelöst. Nie bei einem Fehlschlag |
ue_load_failed (string as_source, string as_reason) | Das Dokument konnte nicht angezeigt werden; as_reason ist eine der unten stehenden Konstanten REASON_*. Der Betrachter bleibt leer |
ue_link_clicked (string as_url) | Der Benutzer ist einem Link im Dokument gefolgt. Der Betrachter bleibt beim Dokument: Öffnen Sie as_url, wo Sie möchten (Browser des Arbeitsplatzes, webbrowser…). as_url ist die Adresse des Links, wie sie ist (https://…, mailto:…); ein Link auf eine lokale Datei — auch relativ zum Dokument — kommt als Festplattenpfad an |
ue_ready ( ) | Die Komponente ist fertig geladen; alles zuvor Gesendete wurde nachgespielt |
ue_runtime_missing ( ) | Die WebView2-Runtime fehlt: die Komponente bleibt leer |
ue_bg_color (long al_color) | Die Komponente hat ihre Design-Hintergrundfarbe berechnet; das Userobject hat sie bereits übernommen (backcolor) |
Warum ein Dokument nicht angezeigt wird #
as_reason von ue_load_failed ist eine dieser Konstanten von u_pbt_pdfviewer. Ein PDF wird so erkannt: Eine lokale Datei hat die Endung .pdf und beginnt mit der Signatur %PDF-; ein entferntes Dokument wird mit dem Typ application/pdf ausgeliefert (dem einzigen, den die Engine an ihren Betrachter übergibt); eine data:-Adresse kündigt application/pdf an.
| Konstante | Wert | Ursache |
|---|---|---|
REASON_NOT_FOUND | "notfound" | Datei fehlt oder ist nicht lesbar, Adresse antwortet mit 404 |
REASON_NOT_PDF | "notpdf" | Kein PDF: lokale Datei ohne die Signatur %PDF-, entfernte Antwort, die nicht application/pdf ist, data: eines anderen Typs |
REASON_TOO_LARGE | "toolarge" | Datei zu groß für diesen Prozess (über 64 MB in 32 Bit, 512 MB in 64 Bit), oder eine data:-Adresse mit mehr als 2 MB Zeichen (etwa 1,5 MB PDF) |
REASON_INSECURE | "insecure" | http://: nicht unterstützt, liefern Sie das Dokument über https:// aus |
REASON_UNSUPPORTED | "unsupported" | Eine andere Art von Adresse (ftp:, blob:…) |
REASON_NETWORK | "network" | Server nicht erreichbar, unbekannter Name, Verbindung unterbrochen |
REASON_CERTIFICATE | "certificate" | Zertifikat der Website ungültig, abgelaufen oder widerrufen |
REASON_AUTH | "auth" | Die Website oder der Proxy verlangt eine Authentifizierung |
REASON_HTTP | "http" | Ein anderer Serverfehler (403, 500…) |
REASON_REFUSED | "refused" | Die Website verweigert die Anzeige in einem Rahmen oder sendet das PDF als Download — die Datei wird deshalb nicht heruntergeladen |
REASON_FAILED | "failed" | Jede andere Ursache |
Was der Benutzer ohne eine einzige Zeile Code tun kann #
Der Betrachter zeigt seine integrierte Symbolleiste über dem Dokument an. Sie müssen nichts programmieren: Sie wird vom System bereitgestellt und lokalisiert.
| Aktion | Wie |
|---|---|
| Seitennavigation | Mausrad und Bildlaufleiste, oder direkte Eingabe der Seitenzahl im Zähler n / gesamt |
| Zoom | Schaltflächen + / −, an Seite oder an Breite anpassen |
| Suche | Die Suchschaltfläche der Symbolleiste, im Text des Dokuments |
Druckerschaltfläche der Symbolleiste (mit ib_allow_print ausblendbar), oder of_print aus Ihrem Code | |
| Speichern | Download-Schaltfläche, um eine Kopie des Dokuments zu speichern (mit ib_allow_save ausblendbar) |
| Drehung | Drehen der Seiten über das Menü der Symbolleiste |
| Tastatur | Sobald die Komponente den Fokus hat (Tab oder of_focus_webview): Bild ab, die Pfeiltasten, Pos1 / Ende scrollen das Dokument, ohne vorherigen Klick |
Die Tastenkürzel des Browsers — Strg+F, Strg+P, Strg + Mausrad — sind in allen Komponenten abgeschaltet, auch in dieser: Verwenden Sie die Schaltflächen der Leiste des Betrachters.
Was der Betrachter nicht mitteilt #
Der Betrachter ist der in die Web-Engine integrierte: nichts zu installieren, Drucken, Suche, PDF-Formulare und Vollbild inbegriffen. Im Gegenzug teilt er Ihrer Anwendung nichts mit: weder die angezeigte Seite noch die Seitenzahl, weder den tatsächlichen Zoom noch den markierten Text, und die Suche lässt sich nicht per Code steuern. ii_page und ii_zoom sagen, wo das Dokument geöffnet wird, nicht wo sich der Benutzer befindet. Das ist eine bewusste Entscheidung für 4.0; eine skriptfähige Darstellung bräuchte eine externe Bibliothek.
Beispiele #
Ein lokales Dokument öffnen #
// Absoluter Pfad, oder relativ zum Verzeichnis der Anwendung
uo_pdf.is_source = "doc\conditions-generales.pdf"
Ein im Web veröffentlichtes Dokument öffnen #
// Eine Webadresse wird genau wie eine lokale Datei geladen
uo_pdf.is_source = "https://www.monsite.fr/tarifs/catalogue-2026.pdf"
Eine Internetverbindung ist selbstverständlich erforderlich; das Laden erfolgt asynchron, ue_load_completed meldet Ihnen das Ende.
Das PDF anzeigen, das eine DataWindow gerade erzeugt hat #
// Local variables
string ls_file
// Eine Datei pro Tag, im temporaeren Ordner
ls_file = "C:\temp\report_" + String(Today(), "yyyymmdd") + ".pdf"
// Die DataWindow erzeugt die Datei...
dw_report.SaveAs(ls_file, PDF!, false)
// ...und der Betrachter zeigt sie sofort an
uo_pdf.is_source = ls_file
Nach der Neuerzeugung der Datei aktualisieren #
// Die Datei wurde am selben Ort neu geschrieben : neu laden, ohne is_source anzufassen
uo_pdf.of_refresh()
Mehrere Dokumente nacheinander im selben Betrachter anzeigen #
// ue_row_changed-Event von dw_list : den Anhang der aktuellen Zeile anzeigen
string ls_pdf
// Der Pfad des PDF der aktuellen Zeile
ls_pdf = dw_list.GetItemString(dw_list.GetRow(), "pdf_path")
// Ohne Anhang wird der Betrachter geleert ; sonst zeigt er ihn an
if ls_pdf = "" then
uo_pdf.of_reset() // kein Anhang : leerer Betrachter
else
uo_pdf.is_source = ls_pdf
end if
Das Ende des Ladevorgangs verfolgen #
// ue_load_completed-Event von uo_pdf : (string as_source)
uo_wait.Hide()
// of_print druckt das angezeigte Dokument
uo_print_button.ib_enabled = true
Sagen, warum das Dokument nicht da ist #
// ue_load_failed-Event von uo_pdf : (string as_source, string as_reason)
uo_wait.Hide()
choose case as_reason
case uo_pdf.REASON_NOT_FOUND
uo_status.of_panel(/*key*/ "main").is_text = "Dokument nicht gefunden: " + as_source
case uo_pdf.REASON_NOT_PDF
uo_status.of_panel(/*key*/ "main").is_text = "Diese Datei ist kein PDF"
case else
uo_status.of_panel(/*key*/ "main").is_text = "Dokument nicht verfuegbar (" + as_reason + ")"
end choose
Einen Link des Dokuments anderswo öffnen #
// ue_link_clicked-Event von uo_pdf : (string as_url)
// Der Betrachter bleibt beim Dokument : der Link oeffnet sich im Browser des Fensters
uo_web.is_address = as_url
Das Dokument drucken #
// clicked der Schaltflaeche Drucken : die Vorschau des PDF-Betrachters, auf dem Dokument selbst
if uo_pdf.of_print() = -4 then
uo_status.of_panel(/*key*/ "main").is_text = "Kein Dokument zu drucken"
end if
Anzeigen, ohne Speichern oder Drucken zu erlauben #
// Ein vertrauliches Dokument : weder Speichern noch Drucken in der Leiste des Betrachters
uo_pdf.ib_allow_save = false
uo_pdf.ib_allow_print = false
uo_pdf.is_source = is_current_document
Setzen Sie sie vor is_source: Jede Änderung lädt das Dokument neu. Das ist kein Schutz: Die Datei bleibt auf der Festplatte lesbar, und of_print druckt weiterhin.
Vorschau in einer Registerkarte, neben der Eingabe #
// open-Event : der Betrachter belegt eine Registerkartenseite, die Eingabe die andere
uo_tab.of_add_page(/*key*/ "entry", /*title*/ "Eingabe", /*page*/ uo_page_entry)
uo_tab.of_add_page(/*key*/ "preview", /*title*/ "Vorschau", /*page*/ uo_page_preview)
// Der Betrachter wird wie jedes andere Steuerelement in uo_page_preview abgelegt
uo_pdf.is_source = is_current_document
Die Komponente lässt sich ohne besondere Vorkehrungen in einer tab oder in einem dockcontainer-Panel hosten.
Die Datei vor der Anzeige prüfen #
// Local variables
string ls_path
// Die Datei der angezeigten Rechnung
ls_path = "C:\factures\" + is_number + ".pdf"
// Keine Datei, nichts zu zeigen : den Betrachter leeren, statt das vorherige Dokument stehen zu lassen
if not FileExists(ls_path) then
uo_pdf.of_reset()
uo_status.of_panel(/*key*/ "main").is_text = "Rechnung nicht gefunden"
return
end if
// Sonst wird die Rechnung angezeigt
uo_pdf.is_source = ls_path
Akzeptierte Formate und Pfade #
Form von is_source | Beispiel | Hinweis |
|---|---|---|
| Absoluter Pfad | "C:\docs\contrat.pdf" | Am zuverlässigsten |
| Relativer Pfad | "doc\notice.pdf" | Relativ zum Verzeichnis der Anwendung |
| Netzwerkpfad | "\\serveur\partage\bon.pdf" | Der Benutzer muss Leserechte besitzen |
Name mit # | "C:\devis\Devis #12.pdf" | Das # gehört zum Dateinamen |
file:-Adresse | "file:///C:/docs/contrat.pdf" | In einen Pfad umgewandelt, wie ein absoluter Pfad; auch file://localhost/C:/… und die UNC-Form mit vier Schrägstrichen file:////server/freigabe/… |
| Webadresse | "https://…/catalogue.pdf" | Als application/pdf ausgeliefert, asynchrones Laden. Ein in der Adresse geschriebenes #page=… wird ignoriert: Verwenden Sie ii_page |
| Dokument im Speicher | "data:application/pdf;base64,…" | Nichts wird auf die Festplatte geschrieben. Über 2 MB Zeichen (etwa 1,5 MB PDF) ue_load_failed mit REASON_TOO_LARGE: Schreiben Sie die Datei und geben Sie ihren Pfad an |
http://-Adresse | "http://intranet/bon.pdf" | Nicht unterstützt: ue_load_failed mit REASON_INSECURE. Liefern Sie das Dokument über https:// aus |
| Leer | "" | Leert den Betrachter |
Diese Komponente unterstützt ausschließlich PDF: Alles andere wird abgelehnt und über ue_load_failed (REASON_NOT_PDF) gemeldet. Für ein Bild verwenden Sie picture; für eine HTML-Seite webbrowser.
Best Practices #
- Beobachten Sie
ue_load_failed: Ein ungültiger Pfad, eine Datei, die kein PDF ist, oder eine nicht erreichbare Website wird dort mit ihrem Grund gemeldet, und der Betrachter bleibt leer. - Rufen Sie
of_reset()auf, wenn kein Dokument mehr angezeigt werden soll (Wechsel zu einer Zeile ohne Anhang): sonst bleibt das vorherige Dokument sichtbar. of_refresh()ist der Weg, eine am selben Pfad neu erzeugte Datei anzuzeigen: Es liest die Datei erneut, ohne die Einstellungen anzutasten. Die Scrollposition bleibt nicht erhalten — der Betrachter beginnt wieder beiii_page.- Jede Änderung von
ii_page,ii_zoom,is_fitoderib_viewer_toolbarlädt das Dokument neu (der Betrachter liest seine Einstellungen nur beim Laden) und löstue_load_completederneut aus: Setzen Sie sie voris_source, damit nur einmal geladen wird. - Sehen Sie eine Wartanzeige für entfernte oder umfangreiche Dokumente vor und blenden Sie sie bei
ue_load_completedund beiue_load_failedaus. - Geben Sie der Komponente eine großzügige Fläche (mindestens die Hälfte des Fensters): Die integrierte Symbolleiste und das Dokument brauchen Platz, um lesbar zu bleiben.
- Um eine Webseite statt eines PDF anzuzeigen, verwenden Sie webbrowser; für ein Bild picture.
Vom gemeinsamen Sockel geerbt #
Diese Mitglieder gibt es bei jeder visuellen Komponente — sie sind nicht dieser eigen. Sie werden einmal in den übergreifenden Kapiteln beschrieben; diese Tabelle sagt nur, wo man sie liest.
| Mitglieder | Rolle | Beschrieben in |
|---|---|---|
of_reset | Die Komponente zurücksetzen | 3.6 Eine Komponente zurücksetzen: of_reset() |
of_register_shortcut · of_clear_shortcuts | Tastenkürzel der Komponente | 3.5 Tastenkombinationen |
of_is_created · of_is_ready · of_get_last_error | Ob sie entstanden ist, ob sie bereit ist, was fehlschlug | 3.7 Diagnose |
of_save_as_png · of_save_as_jpg | Die Darstellung als Bild exportieren | 3.8 Die Darstellung als Bild exportieren |
of_set_redraw | Änderungen zu einem einzigen Neuzeichnen bündeln | 3.10 Best Practices |
of_preload_icons | Symbole ohne Verzögerung | Sofortige Anzeige: of_icon |
of_set_translation | Eine Beschriftung der Komponente übersetzen | 5.2 Eine Beschriftung anpassen: of_set_translation |
of_focus_webview | Der Komponente den Fokus geben | 6.4 Tastatur und Fokus |
of_print · of_print_to_pdf | Drucken oder ein PDF schreiben | 6.9 Drucken |
of_set_property · of_get_property · of_component_name | Eine Eigenschaft über ihren Namen steuern | 3.1 Die Eigenschaften-Engine |
Zwei Helfer werden nicht geerbt: of_icon und of_escape_markup liegen auf n_pbt_utils. Deklarieren Sie eines — n_pbt_utils lnv_utils, nichts zu erzeugen — und rufen Sie sie darauf auf.