pdfviewer — u_pbt_pdfviewer #
← Riferimento dei componenti · Sommario della guida
Visualizzatore PDF integrato: mostra un documento locale o pubblicato sul web, direttamente nella Sua finestra, con paginazione, zoom e stampa.
▶ Vederlo dal vivo — Applicazione dimostrativa, riquadro PDF viewer: l'anteprima, il codice che lo produce e questa pagina, affiancati.
In breve #
| Userobject | u_pbt_pdfviewer |
| Classe degli item | — (componente senza item) |
| Serve per | Visualizzare una fattura, un ordine d'acquisto, un contratto o un manuale senza avviare un'applicazione esterna |
| Opzioni opt-in | — |
Il componente sostituisce il classico « salvare il PDF in un file temporaneo e poi chiamare ShellExecute »: il documento resta all'interno della Sua applicazione, l'utente non lascia mai la schermata corrente.
Avvio rapido #
// event open della finestra : visualizzare un documento presente su disco
uo_pdf.is_source = "C:\factures\FA-2026-0142.pdf"
// event ue_load_completed di uo_pdf : (string as_source)
uo_status.of_panel(/*key*/ "main").is_text = "Documento visualizzato"
Tutto qui: impostare is_source è sufficiente per caricare e visualizzare il documento.
Proprietà #
| Proprietà | Tipo | Predefinito | Ruolo |
|---|---|---|---|
is_source | string | "" | Documento da visualizzare: un percorso di file (assoluto, relativo all'applicazione o di rete; un # fa parte del nome), un indirizzo file:///, un indirizzo web https://… servito come application/pdf, oppure un indirizzo data:application/pdf. Impostare il valore avvia il caricamento; impostare "" svuota il visualizzatore. Tutto il resto viene rifiutato e segnalato da ue_load_failed — http:// compreso. Si rilegge come lo ha scritto |
ii_page | integer | 0 | Pagina visualizzata, contata a partire da 1 (0 = la prima pagina del documento). Una pagina impostata prima di is_source vale per quel documento; altrimenti un nuovo documento si apre alla sua prima pagina. Ogni modifica ricarica il documento e attiva di nuovo ue_load_completed: il lettore legge la pagina solo al caricamento. Sola scrittura: rileggendola si ottiene l'ultima pagina richiesta, non quella a schermo. Il lettore è quello del motore web e non riferisce nulla. |
ii_zoom | integer | 0 | Zoom in percentuale (0 = lasciato al lettore). Impostare uno zoom annulla is_fit, che lo contraddice. Sola scrittura, come ii_page: se l'utente ingrandisce con la barra del lettore, questa proprietà non segue. |
is_fit | string | "" | Adattamento: FIT_PAGE, FIT_WIDTH, FIT_HEIGHT, oppure "" per nessuno. Annulla ii_zoom |
ib_viewer_toolbar | boolean | true | Mostra la barra propria del lettore (numero di pagina, zoom, stampa, download). La nasconda quando la sua finestra porta essa stessa questi comandi |
ib_allow_save | boolean | true | Offre i comandi Salva e Salva con nome della barra del lettore e del suo menu. A false, il documento è mostrato senza proporre di salvarne una copia. Non è una protezione: il file resta leggibile sul disco. Ogni modifica ricarica il documento visualizzato |
ib_allow_print | boolean | true | Offre il comando Stampa della barra del lettore e del suo menu. of_print stampa comunque: decide la Sua applicazione. Ogni modifica ricarica il documento visualizzato |
is_theme_style | string | "" | Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio |
is_theme_mode | string | "" | Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio |
il_theme_accent | long | -1 | Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema) |
Metodi #
| Metodo | Ruolo |
|---|---|
of_refresh ( ) | Rilegge il documento corrente (dal disco o dalla rete) senza toccare le impostazioni: il modo per mostrare un file rigenerato allo stesso percorso. La posizione di scorrimento non viene conservata: il lettore riparte da ii_page. Dopo un errore, ritenta lo stesso documento. Un documento rifiutato viene giudicato di nuovo: ue_load_failed viene sollevato di nuovo. Restituisce 0 una volta richiesto, -4 senza documento (is_source vuoto), -2 se il componente non è creato |
of_print ( ) · of_print (boolean) | Apre l'anteprima di stampa del documento — non della pagina che lo incornicia. Restituisce 0 una volta richiesta l'anteprima, -4 quando nessun documento è visualizzato, -2 se il componente non è creato. L'argomento qui non ha effetto: è sempre l'anteprima del lettore PDF |
of_print_to_pdf (string) | Restituisce -4 su questo componente, senza scrivere nulla: la pagina stampata sarebbe solo il riquadro del lettore, mai il documento. Il documento è già un PDF: copi il file di is_source |
of_reset ( ) | Svuota il visualizzatore e riporta tutte le proprietà al valore predefinito. Restituisce 0 una volta applicato, -2 se il componente non è creato |
of_set_redraw (boolean) | Raggruppa una raffica di modifiche in un unico rendering. Restituisce 0 una volta applicato, -2 se il componente non è creato |
of_save_as_png (string) · of_save_as_jpg (string) | Esporta il rendering come immagine. Restituisce 0 una volta scritta l'immagine, -4 se la scrittura fallisce, -2 se il componente non è creato |
Event #
| Event | Attivato quando |
|---|---|
ue_load_completed (string as_source) | Il documento è visualizzato; as_source è is_source così come lo ha scritto. Attivato anche da of_refresh e da ogni modifica di pagina, zoom, adattamento o barra del lettore. Mai attivato in caso di errore |
ue_load_failed (string as_source, string as_reason) | Il documento non è stato visualizzato; as_reason è una delle costanti REASON_* qui sotto. Il visualizzatore resta vuoto |
ue_link_clicked (string as_url) | L'utente ha seguito un link del documento. Il visualizzatore resta sul documento: apra as_url dove preferisce (browser della postazione, webbrowser…). as_url è l'indirizzo del link così com'è (https://…, mailto:…); un link verso un file locale — anche relativo al documento — arriva come percorso su disco |
ue_ready ( ) | Il componente ha terminato il caricamento; tutto ciò che è stato inviato prima è stato riprodotto |
ue_runtime_missing ( ) | Il runtime WebView2 è assente: il componente resta vuoto |
ue_bg_color (long al_color) | Il componente ha calcolato il colore di sfondo del proprio tema; l'userobject lo ha già adottato (backcolor) |
Perché un documento non viene visualizzato #
as_reason di ue_load_failed è una di queste costanti di u_pbt_pdfviewer. Un PDF si riconosce così: un file locale ha l'estensione .pdf e inizia con la firma %PDF-; un documento remoto è servito con il tipo application/pdf (l'unico che il motore consegna al suo lettore); un indirizzo data: dichiara application/pdf.
| Costante | Valore | Causa |
|---|---|---|
REASON_NOT_FOUND | "notfound" | File assente o illeggibile, indirizzo che risponde 404 |
REASON_NOT_PDF | "notpdf" | Non è un PDF: file locale senza la firma %PDF-, risposta remota che non è application/pdf, data: di un altro tipo |
REASON_TOO_LARGE | "toolarge" | File troppo grande per questo processo (oltre 64 MB a 32 bit, 512 MB a 64 bit), o un indirizzo data: di oltre 2 MB di caratteri (circa 1,5 MB di PDF) |
REASON_INSECURE | "insecure" | http://: non supportato, servite il documento in https:// |
REASON_UNSUPPORTED | "unsupported" | Un altro tipo di indirizzo (ftp:, blob:…) |
REASON_NETWORK | "network" | Server irraggiungibile, nome sconosciuto, connessione interrotta |
REASON_CERTIFICATE | "certificate" | Certificato del sito non valido, scaduto o revocato |
REASON_AUTH | "auth" | Il sito o il proxy richiede un'autenticazione |
REASON_HTTP | "http" | Un altro errore del server (403, 500…) |
REASON_REFUSED | "refused" | Il sito rifiuta di essere mostrato in un riquadro, o invia il PDF come download — il file non viene comunque scaricato |
REASON_FAILED | "failed" | Qualsiasi altra causa |
Che cosa può fare l'utente, senza una riga di codice #
Il visualizzatore mostra la sua barra degli strumenti integrata sopra il documento. Non c'è nulla da programmare: viene fornita e localizzata dal sistema.
| Azione | Come |
|---|---|
| Paginazione | Rotellina e barra di scorrimento, oppure digitando direttamente il numero di pagina nel contatore n / totale |
| Zoom | Pulsanti + / −, adatta alla pagina o alla larghezza |
| Ricerca | Il pulsante di ricerca della barra degli strumenti, nel testo del documento |
| Stampa | Pulsante stampante della barra degli strumenti (nascondibile con ib_allow_print), o of_print dal Suo codice |
| Salvataggio | Pulsante di download, per salvare una copia del documento (nascondibile con ib_allow_save) |
| Rotazione | Rotazione delle pagine dal menu della barra degli strumenti |
| Tastiera | Appena il componente ha il focus (Tab o of_focus_webview): PagGiù, le frecce, Home / Fine fanno scorrere il documento, senza clic preliminare |
Le scorciatoie del browser — Ctrl+F, Ctrl+P, Ctrl + rotellina — sono disattivate in tutti i componenti, compreso questo: usi i pulsanti della barra del lettore.
Ciò che il lettore non dice #
Il lettore è quello integrato nel motore web: nulla da installare, stampa, ricerca, moduli PDF e schermo intero inclusi. In cambio, non comunica nulla alla Sua applicazione: né la pagina visualizzata, né il numero di pagine, né lo zoom reale, né il testo selezionato, e la ricerca non si pilota da codice. ii_page e ii_zoom dicono dove aprire il documento, non dove si trova l'utente. È una scelta deliberata per la 4.0; un rendering programmabile richiederebbe una libreria esterna.
Esempi #
Aprire un documento locale #
// Percorso assoluto, oppure relativo alla directory dell'applicazione
uo_pdf.is_source = "doc\conditions-generales.pdf"
Aprire un documento pubblicato sul web #
// Un indirizzo web si carica esattamente come un file locale
uo_pdf.is_source = "https://www.monsite.fr/tarifs/catalogue-2026.pdf"
Ovviamente è necessaria una connessione a internet; il caricamento è asincrono, ue_load_completed Le segnala la fine.
Visualizzare il PDF appena prodotto da una DataWindow #
// Local variables
string ls_file
// Un file al giorno, nella cartella temporanea
ls_file = "C:\temp\report_" + String(Today(), "yyyymmdd") + ".pdf"
// La DataWindow produce il file...
dw_report.SaveAs(ls_file, PDF!, false)
// ...e il visualizzatore lo mostra immediatamente
uo_pdf.is_source = ls_file
Aggiornare dopo la rigenerazione del file #
// Il file e stato riscritto nella stessa posizione : ricaricare senza toccare is_source
uo_pdf.of_refresh()
Concatenare più documenti nello stesso visualizzatore #
// event ue_row_changed di dw_list : visualizzare l'allegato della riga corrente
string ls_pdf
// Il percorso del PDF della riga corrente
ls_pdf = dw_list.GetItemString(dw_list.GetRow(), "pdf_path")
// Senza allegato il visualizzatore si svuota ; altrimenti lo mostra
if ls_pdf = "" then
uo_pdf.of_reset() // nessun allegato : visualizzatore vuoto
else
uo_pdf.is_source = ls_pdf
end if
Seguire la fine del caricamento #
// event ue_load_completed di uo_pdf : (string as_source)
uo_wait.Hide()
// of_print stampa il documento visualizzato
uo_print_button.ib_enabled = true
Dire perché il documento non c'è #
// event ue_load_failed di 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 = "Documento non trovato: " + as_source
case uo_pdf.REASON_NOT_PDF
uo_status.of_panel(/*key*/ "main").is_text = "Questo file non e un PDF"
case else
uo_status.of_panel(/*key*/ "main").is_text = "Documento non disponibile (" + as_reason + ")"
end choose
Aprire altrove un link del documento #
// event ue_link_clicked di uo_pdf : (string as_url)
// Il visualizzatore resta sul documento : il link si apre nel browser della finestra
uo_web.is_address = as_url
Stampare il documento #
// clicked del pulsante Stampa : l'anteprima del lettore PDF, sul documento stesso
if uo_pdf.of_print() = -4 then
uo_status.of_panel(/*key*/ "main").is_text = "Nessun documento da stampare"
end if
Mostrare senza lasciar salvare né stampare #
// Un documento riservato : ne Salva ne Stampa nella barra del lettore
uo_pdf.ib_allow_save = false
uo_pdf.ib_allow_print = false
uo_pdf.is_source = is_current_document
Li imposti prima di is_source: ogni modifica ricarica il documento. Non è una protezione: il file resta leggibile sul disco, e of_print stampa comunque.
Anteprima in una scheda, accanto all'inserimento dati #
// event open : il visualizzatore occupa una pagina della scheda, l'inserimento dati l'altra
uo_tab.of_add_page(/*key*/ "entry", /*title*/ "Inserimento", /*page*/ uo_page_entry)
uo_tab.of_add_page(/*key*/ "preview", /*title*/ "Anteprima", /*page*/ uo_page_preview)
// Il visualizzatore e collocato in uo_page_preview come qualsiasi altro controllo
uo_pdf.is_source = is_current_document
Il componente si ospita senza particolari precauzioni in un tab o in un pannello dockcontainer.
Verificare il file prima di visualizzarlo #
// Local variables
string ls_path
// Il file della fattura visualizzata
ls_path = "C:\factures\" + is_number + ".pdf"
// Nessun file, niente da mostrare : si svuota il visualizzatore invece di lasciare il documento precedente
if not FileExists(ls_path) then
uo_pdf.of_reset()
uo_status.of_panel(/*key*/ "main").is_text = "Fattura non trovata"
return
end if
// Altrimenti, la fattura viene mostrata
uo_pdf.is_source = ls_path
Formati e percorsi accettati #
Forma di is_source | Esempio | Nota |
|---|---|---|
| Percorso assoluto | "C:\docs\contrat.pdf" | Il più affidabile |
| Percorso relativo | "doc\notice.pdf" | Relativo alla directory dell'applicazione |
| Percorso di rete | "\\serveur\partage\bon.pdf" | L'utente deve avere i diritti di lettura |
Nome con # | "C:\devis\Devis #12.pdf" | Il # fa parte del nome del file |
Indirizzo file: | "file:///C:/docs/contrat.pdf" | Convertito in percorso, come un percorso assoluto; anche file://localhost/C:/… e la forma UNC a quattro barre file:////server/condivisione/… |
| Indirizzo web | "https://…/catalogue.pdf" | Servito come application/pdf, caricamento asincrono. Un #page=… scritto nell'indirizzo è ignorato: usi ii_page |
| Documento in memoria | "data:application/pdf;base64,…" | Nulla viene scritto su disco. Oltre 2 MB di caratteri (circa 1,5 MB di PDF), ue_load_failed con REASON_TOO_LARGE: scriva il file e ne indichi il percorso |
Indirizzo http:// | "http://intranet/bon.pdf" | Non supportato: ue_load_failed con REASON_INSECURE. Servite il documento in https:// |
| Vuoto | "" | Svuota il visualizzatore |
Questo componente supporta soltanto il PDF: tutto il resto viene rifiutato e segnalato da ue_load_failed (REASON_NOT_PDF). Per un'immagine, usi picture; per una pagina HTML, webbrowser.
Buone pratiche #
- Tenga d'occhio
ue_load_failed: un percorso non valido, un file che non è un PDF o un sito irraggiungibile vi viene segnalato con la sua causa, e il visualizzatore resta vuoto. - Chiami
of_reset()quando non deve più essere visualizzato alcun documento (cambio di riga senza allegato): altrimenti il documento precedente resta visibile. of_refresh()è il modo per mostrare un file rigenerato allo stesso percorso: rilegge il file senza toccare le impostazioni. Non conserva la posizione di scorrimento — il lettore riparte daii_page.- Ogni modifica di
ii_page,ii_zoom,is_fitoib_viewer_toolbarricarica il documento (il lettore legge le impostazioni solo al caricamento) e attiva di nuovoue_load_completed: le imposti prima diis_sourceper un solo caricamento. - Preveda un indicatore di attesa per i documenti remoti o voluminosi, e lo nasconda su
ue_load_completede suue_load_failed. - Dia al componente una superficie confortevole (almeno metà della finestra): la barra degli strumenti integrata e il documento hanno bisogno di spazio per restare leggibili.
- Per visualizzare una pagina web anziché un PDF, usi webbrowser; per un'immagine, picture.
Ereditato dalla base comune #
Questi membri esistono su tutti i componenti visivi — non sono propri di questo. Sono descritti una sola volta, nei capitoli trasversali; questa tabella dice solo dove leggerli.
| Membri | Ruolo | Descritto in |
|---|---|---|
of_reset | Riportare il componente a zero | 3.6 Riportare un componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Scorciatoie da tastiera del componente | 3.5 Le scorciatoie da tastiera |
of_is_created · of_is_ready · of_get_last_error | Se è nato, se è pronto, cosa è fallito | 3.7 Diagnostica |
of_save_as_png · of_save_as_jpg | Esportare il rendering in immagine | 3.8 Esportare il rendering come immagine |
of_set_redraw | Raggruppare le modifiche in un solo ridisegno | 3.10 Buone pratiche |
of_preload_icons | Icone mostrate senza ritardo | Visualizzazione istantanea: of_icon |
of_set_translation | Tradurre una dicitura del componente | 5.2 Adattare un'etichetta: of_set_translation |
of_focus_webview | Dare il focus al componente | 6.4 Tastiera e focus |
of_print · of_print_to_pdf | Stampare, o scrivere un PDF | 6.9 Stampare |
of_set_property · of_get_property · of_component_name | Pilotare una proprietà per nome | 3.1 Il motore delle proprietà |
Due aiuti non sono ereditati: of_icon e of_escape_markup vivono su n_pbt_utils. Ne dichiari uno — n_pbt_utils lnv_utils, niente da creare — e li chiami su di esso.