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 (numero di pagina, zoom, stampa, download). La nasconda quando la sua finestra porta essa stessa questi comandi
ib_navigation_panebooleanfalseApre il pannello laterale del lettore: le miniature delle pagine e i segnalibri del documento. Il pannello arriva con la barra del lettore. Ogni modifica ricarica il documento visualizzato
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
is_findstring""Un testo del documento, evidenziato dove compare per la prima volta, con il lettore che vi scorre: la riga di una fattura di cui parla la Sua applicazione. "" per nessuno; un testo assente dal documento non cambia nulla. Non è una ricerca pilotata dal codice (né conteggio, né occorrenza successiva): l'utente cerca con la barra del lettore. Mantenuto per i documenti successivi finché non lo 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. is_find evidenzia comunque un testo: 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_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_fullscreenbooleantrueOffre il comando Schermo intero 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
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_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) — of_get_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, pannello, destinazione, testo evidenziato, ib_allow_save o ib_allow_print — 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, 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 dal codice (is_find evidenzia un testo all'apertura, niente di più). 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.

Mostrare una riga precisa del documento #

// Il lettore si apre sul primo passaggio di questo testo, evidenziato
uo_pdf.is_find = "Delivery and assembly"
uo_pdf.is_source = "C:\factures\FA-2026-0142.pdf"

Aprire su un capitolo, segnalibri visibili #

// Il pannello laterale e i suoi segnalibri, aperto sul capitolo "prices" del catalogo
uo_pdf.ib_navigation_pane = true
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
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à
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