PBToolboxAI v5 ← 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 "" (o solo spazi) svuota il visualizzatore mantenendone le impostazioni. Tutto il resto viene rifiutato e segnalato da ue_load_failed — compreso http:// e un indirizzo che contiene nome utente e password (https://nome:segreto@…). Un PDF contenuto in un blob si visualizza con of_load_blob. Si rilegge come lo ha scritto
ii_pageinteger0Pagina di apertura, contata a partire da 1 (0 = la prima pagina del documento). Impostata mentre un documento è visualizzato, è la pagina di quel documento: si ricarica, aperto su di essa. Impostata a visualizzatore vuoto, vale per il documento successivo; altrimenti un nuovo documento si apre alla sua prima pagina. Per aprire un documento su una pagina, imposti is_source e poi ii_page: un solo caricamento. Ogni modifica ricarica il documento e attiva di nuovo ue_load_completed: il lettore legge la pagina solo al caricamento; lo stesso valore reimpostato non fa nulla. Solo in scrittura: rileggerla restituisce l'ultima pagina richiesta, non quella visualizzata. Il lettore è quello del motore web e non comunica nulla.
ii_zoominteger0Zoom in percentuale, da 25 a 500 — l'intervallo dei pulsanti del lettore (0 = lasciato al visualizzatore). Un valore fuori da questo intervallo vi viene ricondotto e si rilegge come applicato. Impostare uno zoom annulla is_fit, che lo contraddice. Solo in scrittura, come ii_page: se l'utente zooma 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 (sommario, numero di pagina, zoom, rotazione, ricerca, stampa, salvataggio). La nasconda quando la sua finestra porta essa stessa questi comandi. Il lettore integrato in WebView2 non ha un comando Schermo intero
is_destinationstring""Apre il documento su una destinazione con nome del PDF — la destinazione di un segnalibro, scritta dallo strumento che ha prodotto il file. "" per nessuna; un nome che il documento non ha lo apre alla prima pagina. Mantenuta per i documenti successivi finché non la cambia. Ogni modifica ricarica il documento visualizzato
ib_allow_savebooleantrueOffre i comandi Salva e Salva con nome della barra del lettore e del suo menu. A false, il documento viene mostrato senza proporre di salvarne una copia. Ogni visualizzatore mantiene la propria impostazione: quella di un'altra finestra non cambia nulla qui. Non è una protezione: il file resta leggibile sul disco. Ogni modifica ricarica il documento visualizzato; impostata prima di is_source, il documento si carica una sola volta
ib_allow_printbooleantrueOffre il comando Stampa della barra del lettore e del suo menu. of_print stampa comunque: decide la Sua applicazione. Ogni visualizzatore mantiene la propria impostazione. Ogni modifica ricarica il documento visualizzato; impostata prima di is_source, il documento si carica una sola volta
ib_allow_searchbooleantrueOffre il comando Cerca della barra del lettore. La ricerca appartiene all'utente (anche con Ctrl+F): il lettore non offre alcuna ricerca pilotata dalla Sua applicazione. Ogni visualizzatore mantiene la propria impostazione. Ogni modifica ricarica il documento visualizzato; impostata prima di is_source, il documento si carica una sola volta
ib_allow_rotatebooleantrueOffre il comando Ruota della barra del lettore. Ogni visualizzatore mantiene la propria impostazione. Ogni modifica ricarica il documento visualizzato; impostata prima di is_source, il documento si carica una sola volta
ib_allow_navigation_panebooleantrueOffre il pulsante Sommario della barra del lettore, in alto a sinistra: apre il pannello laterale con i segnalibri e le miniature delle pagine. A false, il pulsante scompare. Che il pannello sia aperto riguarda il lettore e l'utente: la Sua applicazione offre il pulsante o no. Ogni visualizzatore mantiene la propria impostazione. Ogni modifica ricarica il documento visualizzato; impostata prima di is_source, il documento si carica una sola volta
is_theme_stylestring""Stile visivo della superficie propria del componente: ciò che il visualizzatore mostra quando non contiene alcun documento (prima del primo, dopo is_source = "" o un documento rifiutato). Il lettore PDF mantiene il proprio aspetto: segue il tema dell'applicazione (PBT_SetDefaultTheme), solo chiaro o scuro, perché WebView2 dà a tutti i suoi lettori PDF uno stesso schema di colori. Vuoto = quello dell'applicazione, seguito a ogni cambio
is_theme_modestring""Variante chiara o scura della superficie propria del componente, visibile quando il visualizzatore non contiene alcun documento. Il lettore PDF non la segue: la sua barra e i suoi margini prendono il chiaro o lo scuro del tema dell'applicazione (PBT_SetDefaultTheme). 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). Nessun effetto visibile qui: né il lettore PDF né il visualizzatore vuoto disegnano con un accento. Il valore viene conservato e si rilegge come impostato

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_load_blob (blob ablb_pdf) · of_load_blob (blob ablb_pdf, string as_name)Visualizza un PDF contenuto in un blob — letto dal database (SELECTBLOB) o ricevuto da un servizio — senza scrivere un file, qualunque sia la sua dimensione: i byte restano in memoria e sono serviti solo a questo visualizzatore. Il secondo argomento è il nome restituito da is_source e da ue_load_completed / ue_load_failed (document.pdf senza di esso). Il blob visualizzato prima viene liberato, questo lo sarà dal documento successivo o da of_reset. Restituisce 0 una volta richiesto (segue ue_load_completed), -5 se il blob è vuoto o non è un PDF, -4 se è troppo grande per questo processo (64 MB a 32 bit, 512 MB a 64 bit) — is_last_error dice perché —, -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) · of_print_to_pdf (string, boolean)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 come lo ha scritto (per un blob, il nome dato a of_load_blob). Attivato anche da of_refresh e da ogni modifica di pagina, zoom, adattamento, barra del lettore, destinazione o di un comando ib_allow_* — li imposti prima di is_source per un solo caricamento; lo stesso valore reimpostato non lo attiva. Mai attivato su un 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 relativo di un documento locale arriva come percorso su disco. Un link verso un file locale della postazione (file:///) in un PDF non viene seguito: il lettore PDF di WebView2 lo blocca; nessun ue_link_clicked viene attivato
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 (un file server che risponde application/octet-stream: scarichi prima il documento, vedere gli esempi), data: o blob 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:…), o un indirizzo che contiene nome utente e password (https://nome:segreto@…)
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: scarichi il documento con il restclient (token, credenziali), poi lo visualizzi (vedere gli esempi)
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: niente da installare, stampa, ricerca e moduli PDF 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 dal codice: il lettore ignora i parametri di apertura che evidenzierebbero un testo o aprirebbero il suo pannello laterale. Non ha un comando Schermo intero e segue il tema chiaro o scuro dell'applicazione, mai quello del componente. ii_page e ii_zoom dicono dove aprire il documento, non dove si trova l'utente. Un PDF protetto da password: il lettore la chiede da sé all'utente, la Sua applicazione non può fornirla. È una scelta deliberata; un rendering pilotabile da script 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 rowfocuschanged di dw_list : (long currentrow)
// Local variables
string ls_pdf

// Il percorso del PDF della riga corrente
ls_pdf = dw_list.GetItemString(currentrow, "pdf_path")

// Senza allegato il visualizzatore si svuota (impostazioni mantenute) ; altrimenti lo mostra
if ls_pdf = "" then
	uo_pdf.is_source = ""
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

Le imposti prima di is_source: il documento si carica una sola volta. Ogni visualizzatore mantiene la propria impostazione. 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.is_source = ""
    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

Visualizzare un PDF letto dal database (blob) #

// Local variables
blob lblb_pdf

// La fattura salvata nel database, letta in un blob
SELECTBLOB pdf_file INTO :lblb_pdf FROM invoice WHERE invoice_no = :is_number USING SQLCA;

// Mostrata direttamente dalla memoria : nessun file temporaneo, qualunque sia la dimensione
if SQLCA.SQLCode = 0 then
	uo_pdf.of_load_blob(/*pdf*/ lblb_pdf, /*name*/ "invoice-" + is_number + ".pdf")
end if

Il nome dato ritorna in is_source e in ue_load_completed; il blob viene liberato dal documento successivo o da of_reset.

Aprire su un capitolo #

// Aperto sul capitolo "prices" del catalogo; il pulsante Sommario del lettore elenca i segnalibri
uo_pdf.is_destination = "prices"
uo_pdf.is_source = "doc\catalogue-2026.pdf"

Il nome di una destinazione è quello scritto dallo strumento che ha prodotto il PDF: il Suo generatore di documenti lo conosce.

Un documento dietro un token, o servito come octet-stream #

// Local variables
long ll_status
string ls_file

// Il restclient (inv_rest, preparato all'apertura della finestra) invia il token e scarica il file
ls_file = "C:\temp\invoice-4152.pdf"
ll_status = inv_rest.of_download(/*url*/ "/orders/4152/invoice.pdf", /*path*/ ls_file)

// Poi il visualizzatore mostra il file, qualunque tipo abbia annunciato il server
if ll_status = 200 then
	uo_pdf.is_source = ls_file
end if

Il lettore del motore non sa né inviare un token né mostrare una risposta application/octet-stream (REASON_AUTH, REASON_NOT_PDF): il restclient lo fa al suo posto.


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 viene ignorato: usi ii_page. Un indirizzo che contiene credenziali (https://nome:segreto@…) viene rifiutato (REASON_UNSUPPORTED): passi dal restclient
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: per un documento in memoria più grande, of_load_blob
Indirizzo http://"http://intranet/bon.pdf"Non supportato: ue_load_failed con REASON_INSECURE. Servite il documento in https://
Vuoto""Svuota il visualizzatore e ne mantiene le impostazioni; anche un valore fatto di spazi

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
ib_created · ib_ready · is_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 · is_component_namePilotare una proprietà per nome3.1 Il motore delle proprietà
is_accessible_name · is_accessible_descriptionIl nome e la descrizione che dice un lettore di schermo3.4 Proprietà ed event opzionali

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