PBToolboxAI v4 ← Site

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 #

Userobjectu_pbt_pdfviewer
Classe degli item— (componente senza item)
Serve perVisualizzare 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àTipoPredefinitoRuolo
is_sourcestring""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_pageinteger0Pagina 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_zoominteger0Zoom 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_fitstring""Adattamento: FIT_PAGE, FIT_WIDTH, FIT_HEIGHT, oppure "" per nessuno. Annulla ii_zoom
ib_viewer_toolbarbooleantrueMostra la barra propria del lettore (numero di pagina, zoom, stampa, download). La nasconda quando la sua finestra porta essa stessa questi comandi
ib_allow_savebooleantrueOffre 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_printbooleantrueOffre 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_stylestring""Stile visivo del componente (costanti THEME_STYLE_*); vuoto = quello dell'applicazione, seguito a ogni cambio
is_theme_modestring""Variante chiara o scura (costanti THEME_MODE_*); vuoto = quella dell'applicazione, seguita a ogni cambio
il_theme_accentlong-1Colore d'accento di questo componente (-1 = accento dell'applicazione, o quello del tema)

Metodi #

MetodoRuolo
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 #

EventAttivato 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.

CostanteValoreCausa
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.

AzioneCome
PaginazioneRotellina e barra di scorrimento, oppure digitando direttamente il numero di pagina nel contatore n / totale
ZoomPulsanti + / −, adatta alla pagina o alla larghezza
RicercaIl pulsante di ricerca della barra degli strumenti, nel testo del documento
StampaPulsante stampante della barra degli strumenti (nascondibile con ib_allow_print), o of_print dal Suo codice
SalvataggioPulsante di download, per salvare una copia del documento (nascondibile con ib_allow_save)
RotazioneRotazione delle pagine dal menu della barra degli strumenti
TastieraAppena 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
// 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_sourceEsempioNota
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 #

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.

MembriRuoloDescritto in
of_resetRiportare il componente a zero3.6 Riportare un componente a zero: of_reset()
of_register_shortcut · of_clear_shortcutsScorciatoie da tastiera del componente3.5 Le scorciatoie da tastiera
of_is_created · of_is_ready · of_get_last_errorSe è nato, se è pronto, cosa è fallito3.7 Diagnostica
of_save_as_png · of_save_as_jpgEsportare il rendering in immagine3.8 Esportare il rendering come immagine
of_set_redrawRaggruppare le modifiche in un solo ridisegno3.10 Buone pratiche
of_preload_iconsIcone mostrate senza ritardoVisualizzazione istantanea: of_icon
of_set_translationTradurre una dicitura del componente5.2 Adattare un'etichetta: of_set_translation
of_focus_webviewDare il focus al componente6.4 Tastiera e focus
of_print · of_print_to_pdfStampare, o scrivere un PDF6.9 Stampare
of_set_property · of_get_property · of_component_namePilotare una proprietà per nome3.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.


← Riferimento dei componenti · Sommario della guida