PBToolboxAI v4 ← Site

pdfviewer — u_pbt_pdfviewer #

← Referencia de componentes · Índice de la guía

Visor de PDF integrado: muestra un documento local o publicado en la web, directamente dentro de su ventana, con paginación, zoom e impresión.

▶ Verlo en vivo — Aplicación de demostración, mosaico PDF viewer: la vista previa, el código que lo genera y esta página, uno al lado del otro.


De un vistazo #

Userobjectu_pbt_pdfviewer
Clase de items— (componente sin items)
Sirve paraMostrar una factura, un pedido, un contrato o un manual sin abrir una aplicación externa
Opciones opt-in—

El componente sustituye al clásico «guardar el PDF en un fichero temporal y después llamar a ShellExecute»: el documento permanece dentro de su aplicación y el usuario nunca abandona la pantalla en curso.


Inicio rápido #

// event open de la ventana : mostrar un documento presente en el disco
uo_pdf.is_source = "C:\factures\FA-2026-0142.pdf"
// event ue_load_completed de uo_pdf : (string as_source)
uo_status.of_panel(/*key*/ "main").is_text = "Documento mostrado"

Eso es todo: basta con asignar is_source para cargar y mostrar el documento.


Propiedades #

PropiedadTipoPredeterminadoFunción
is_sourcestring""Documento que se debe mostrar: una ruta de fichero (absoluta, relativa a la aplicación o de red; un # forma parte del nombre), una dirección file:///, una dirección web https://… servida como application/pdf, o una dirección data:application/pdf. Asignar el valor desencadena la carga; asignar "" vacía el visor. Todo lo demás se rechaza y se señala con ue_load_failed — http:// incluido. Se relee tal como lo escribió
ii_pageinteger0Página mostrada, contada a partir de 1 (0 = la primera página del documento). Una página asignada antes de is_source vale para ese documento; si no, un documento nuevo se abre en su primera página. Cada cambio vuelve a cargar el documento y activa de nuevo ue_load_completed: el lector solo lee su página al cargar. Solo escritura: al releerla se obtiene la última página solicitada, no la mostrada. El lector es el del motor web y no informa de nada.
ii_zoominteger0Zoom en porcentaje (0 = a cargo del visor). Fijar un zoom anula is_fit, que lo contradice. Solo escritura, como ii_page: si el usuario amplía con la barra del lector, esta propiedad no lo sigue.
is_fitstring""Ajuste: FIT_PAGE, FIT_WIDTH, FIT_HEIGHT, o "" para ninguno. Anula ii_zoom
ib_viewer_toolbarbooleantrueMuestra la barra propia del visor (número de página, zoom, impresión, descarga). Ocúltela cuando su ventana lleve esos comandos ella misma
ib_allow_savebooleantrueOfrece los comandos Guardar y Guardar como de la barra del lector y de su menú. A false, el documento se muestra sin proponer guardar una copia. No es una protección: el fichero sigue siendo legible en el disco. Cada cambio vuelve a cargar el documento mostrado
ib_allow_printbooleantrueOfrece el comando Imprimir de la barra del lector y de su menú. of_print sigue imprimiendo: decide su aplicación. Cada cambio vuelve a cargar el documento mostrado
is_theme_stylestring""Estilo visual del componente (constantes THEME_STYLE_*); vacío = el de la aplicación, seguido en cada cambio
is_theme_modestring""Variante clara u oscura (constantes THEME_MODE_*); vacío = la de la aplicación, seguida en cada cambio
il_theme_accentlong-1Color de acento de este componente (-1 = acento de la aplicación, o el del tema)

Métodos #

MétodoFunción
of_refresh ( )Vuelve a leer el documento actual (del disco o de la red) sin tocar los ajustes: el modo de mostrar un fichero regenerado en la misma ruta. La posición de desplazamiento no se conserva: el lector vuelve a empezar en ii_page. Tras un fallo, reintenta el mismo documento. Un documento rechazado se juzga de nuevo: ue_load_failed se vuelve a lanzar. Devuelve 0 una vez solicitado, -4 sin documento (is_source vacío), -2 si el componente no está creado
of_print ( ) · of_print (boolean)Abre la vista previa de impresión del documento — no de la página que lo enmarca. Devuelve 0 una vez solicitada la vista previa, -4 cuando no se muestra ningún documento, -2 si el componente no está creado. El argumento no tiene efecto aquí: siempre es la vista previa del lector PDF
of_print_to_pdf (string)Devuelve -4 en este componente, sin escribir nada: la página impresa solo sería el marco del lector, nunca el documento. El documento ya es un PDF: copie el fichero de is_source
of_reset ( )Vacía el visor y restablece todas las propiedades a su valor predeterminado. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_set_redraw (boolean)Agrupa una ráfaga de modificaciones en una sola representación. Devuelve 0 una vez aplicado, -2 si el componente no está creado
of_save_as_png (string) · of_save_as_jpg (string)Exporta la representación como imagen. Devuelve 0 una vez escrita la imagen, -4 si la escritura falla, -2 si el componente no está creado

Eventos #

EventoSe activa cuando
ue_load_completed (string as_source)El documento se muestra; as_source es is_source tal como lo escribió. También se activa con of_refresh y con cada cambio de página, zoom, ajuste o barra del lector. Nunca se activa ante un fallo
ue_load_failed (string as_source, string as_reason)No se ha podido mostrar el documento; as_reason es una de las constantes REASON_* de más abajo. El visor permanece vacío
ue_link_clicked (string as_url)El usuario ha seguido un enlace del documento. El visor permanece en el documento: abra as_url donde quiera (navegador del puesto, webbrowser…). as_url es la dirección del enlace tal cual (https://…, mailto:…); un enlace a un fichero local — incluso relativo al documento — llega como ruta de disco
ue_ready ( )El componente ha terminado de cargarse; todo lo enviado antes se ha reproducido
ue_runtime_missing ( )El runtime WebView2 está ausente: el componente permanece vacío
ue_bg_color (long al_color)El componente ha calculado el color de fondo de su tema; el userobject ya lo ha adoptado (backcolor)

Por qué no se muestra un documento #

as_reason de ue_load_failed es una de estas constantes de u_pbt_pdfviewer. Un PDF se reconoce así: un fichero local tiene la extensión .pdf y empieza por la firma %PDF-; un documento remoto se sirve con el tipo application/pdf (el único que el motor entrega a su lector); una dirección data: anuncia application/pdf.

ConstanteValorCausa
REASON_NOT_FOUND"notfound"Fichero ausente o ilegible, dirección que responde 404
REASON_NOT_PDF"notpdf"No es un PDF: fichero local sin la firma %PDF-, respuesta remota que no es application/pdf, data: de otro tipo
REASON_TOO_LARGE"toolarge"Fichero demasiado grande para este proceso (más de 64 MB en 32 bits, 512 MB en 64 bits), o una dirección data: de más de 2 MB de caracteres (unos 1,5 MB de PDF)
REASON_INSECURE"insecure"http://: no admitido, sirva el documento en https://
REASON_UNSUPPORTED"unsupported"Otro tipo de dirección (ftp:, blob:…)
REASON_NETWORK"network"Servidor inaccesible, nombre desconocido, conexión cortada
REASON_CERTIFICATE"certificate"Certificado del sitio no válido, caducado o revocado
REASON_AUTH"auth"El sitio o el proxy solicita una autenticación
REASON_HTTP"http"Otro error del servidor (403, 500…)
REASON_REFUSED"refused"El sitio se niega a mostrarse en un marco, o envía el PDF como descarga — el fichero no se descarga por ello
REASON_FAILED"failed"Cualquier otra causa

Lo que el usuario puede hacer, sin una sola línea de código #

El visor muestra su barra de herramientas integrada encima del documento. Usted no tiene que programar nada: la proporciona y la traduce el sistema.

AcciónCómo
PaginaciónRueda del ratón y barra de desplazamiento, o escritura directa del número de página en el contador n / total
ZoomBotones + / −, ajuste a la página o al ancho
BúsquedaEl botón de búsqueda de la barra de herramientas, en el texto del documento
ImpresiónBotón de impresora de la barra de herramientas (se oculta con ib_allow_print), o of_print desde su código
GuardadoBotón de descarga, para guardar una copia del documento (se oculta con ib_allow_save)
RotaciónRotación de las páginas desde el menú de la barra de herramientas
TecladoEn cuanto el componente tiene el foco (Tab u of_focus_webview): AvPág, las flechas, Inicio / Fin desplazan el documento, sin clic previo

Los atajos del navegador — Ctrl+F, Ctrl+P, Ctrl + rueda — están desactivados en todos los componentes, este incluido: use los botones de la barra del lector.

Lo que el lector no dice #

El lector es el integrado en el motor web: nada que instalar, impresión, búsqueda, formularios PDF y pantalla completa incluidos. A cambio, no informa de nada a su aplicación: ni la página mostrada, ni el número de páginas, ni el zoom real, ni el texto seleccionado, y la búsqueda no se controla por código. ii_page e ii_zoom dicen dónde abrir el documento, no dónde está el usuario. Es una elección deliberada para la 4.0; un renderizado programable necesitaría una biblioteca externa.


Ejemplos #

Abrir un documento local #

// Ruta absoluta, o relativa al directorio de la aplicacion
uo_pdf.is_source = "doc\conditions-generales.pdf"

Abrir un documento publicado en la web #

// Una direccion web se carga exactamente como un fichero local
uo_pdf.is_source = "https://www.monsite.fr/tarifs/catalogue-2026.pdf"

Evidentemente se necesita una conexión a internet; la carga es asíncrona y ue_load_completed le indica el final.

Mostrar el PDF que acaba de producir una DataWindow #

// Local variables
string ls_file

// Un fichero por dia, en la carpeta temporal
ls_file = "C:\temp\report_" + String(Today(), "yyyymmdd") + ".pdf"

// La DataWindow produce el fichero...
dw_report.SaveAs(ls_file, PDF!, false)

// ...y el visor lo muestra inmediatamente
uo_pdf.is_source = ls_file

Actualizar después de regenerar el fichero #

// El fichero se ha reescrito en la misma ubicacion : recargar sin modificar is_source
uo_pdf.of_refresh()

Encadenar varios documentos en el mismo visor #

// event ue_row_changed de dw_list : mostrar el adjunto de la fila actual
string ls_pdf

// La ruta del PDF de la fila actual
ls_pdf = dw_list.GetItemString(dw_list.GetRow(), "pdf_path")

// Sin adjunto el visor se vacia ; si no, lo muestra
if ls_pdf = "" then
    uo_pdf.of_reset()          // ningun adjunto : visor vacio
else
    uo_pdf.is_source = ls_pdf
end if

Seguir el final de la carga #

// event ue_load_completed de uo_pdf : (string as_source)
uo_wait.Hide()

// of_print imprime el documento mostrado
uo_print_button.ib_enabled = true

Decir por qué el documento no está #

// event ue_load_failed de 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 no encontrado: " + as_source
	case uo_pdf.REASON_NOT_PDF
		uo_status.of_panel(/*key*/ "main").is_text = "Este fichero no es un PDF"
	case else
		uo_status.of_panel(/*key*/ "main").is_text = "Documento no disponible (" + as_reason + ")"
end choose

Abrir en otro sitio un enlace del documento #

// event ue_link_clicked de uo_pdf : (string as_url)
// El visor permanece en el documento : el enlace se abre en el navegador de la ventana
uo_web.is_address = as_url

Imprimir el documento #

// clicked del boton Imprimir : la vista previa del lector PDF, sobre el propio documento
if uo_pdf.of_print() = -4 then
	uo_status.of_panel(/*key*/ "main").is_text = "Ningun documento que imprimir"
end if

Mostrar sin dejar guardar ni imprimir #

// Un documento confidencial : ni Guardar ni Imprimir en la barra del lector
uo_pdf.ib_allow_save = false
uo_pdf.ib_allow_print = false
uo_pdf.is_source = is_current_document

Póngalas antes de is_source: cada cambio vuelve a cargar el documento. No es una protección: el fichero sigue siendo legible en el disco, y of_print sigue imprimiendo.

Vista previa en una pestaña, junto a la entrada de datos #

// event open : el visor ocupa una pagina de pestana, la entrada de datos la otra
uo_tab.of_add_page(/*key*/ "entry",  /*title*/ "Entrada",   /*page*/ uo_page_entry)
uo_tab.of_add_page(/*key*/ "preview",  /*title*/ "Vista previa",   /*page*/ uo_page_preview)

// El visor se coloca en uo_page_preview como cualquier otro control
uo_pdf.is_source = is_current_document

El componente se aloja sin ninguna precaución especial dentro de un tab o de un panel dockcontainer.

Comprobar el fichero antes de mostrarlo #

// Local variables
string ls_path

// El fichero de la factura mostrada
ls_path = "C:\factures\" + is_number + ".pdf"

// Sin fichero, nada que mostrar : vaciamos el visor en lugar de dejar el documento anterior
if not FileExists(ls_path) then
    uo_pdf.of_reset()
    uo_status.of_panel(/*key*/ "main").is_text = "Factura no encontrada"
    return
end if

// Si no, se muestra la factura
uo_pdf.is_source = ls_path

Formatos y rutas admitidos #

Forma de is_sourceEjemploObservación
Ruta absoluta"C:\docs\contrat.pdf"La más fiable
Ruta relativa"doc\notice.pdf"Relativa al directorio de la aplicación
Ruta de red"\\serveur\partage\bon.pdf"El usuario debe tener permisos de lectura
Nombre con #"C:\devis\Devis #12.pdf"El # forma parte del nombre del fichero
Dirección file:"file:///C:/docs/contrat.pdf"Convertida en ruta, como una ruta absoluta; también file://localhost/C:/… y la forma UNC de cuatro barras file:////servidor/recurso/…
Dirección web"https://…/catalogue.pdf"Servida como application/pdf, carga asíncrona. Un #page=… escrito en la dirección se ignora: utilice ii_page
Documento en memoria"data:application/pdf;base64,…"No se escribe nada en el disco. Más allá de 2 MB de caracteres (unos 1,5 MB de PDF), ue_load_failed con REASON_TOO_LARGE: escriba el fichero y dé su ruta
Dirección http://"http://intranet/bon.pdf"No admitida: ue_load_failed con REASON_INSECURE. Sirva el documento en https://
Vacío""Vacía el visor

Este componente solo admite PDF: lo demás se rechaza y se señala con ue_load_failed (REASON_NOT_PDF). Para una imagen, utilice picture; para una página HTML, webbrowser.


Buenas prácticas #

Heredado de la base común #

Estos miembros existen en todos los componentes visuales — no son propios de este. Se detallan una sola vez, en los capítulos transversales; esta tabla solo dice dónde leerlos.

MiembrosFunciónDetallado en
of_resetPoner el componente a cero3.6 Poner un componente a cero: of_reset()
of_register_shortcut · of_clear_shortcutsAtajos de teclado del componente3.5 Los atajos de teclado
of_is_created · of_is_ready · of_get_last_errorSi ha nacido, si está listo, qué ha fallado3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar el render como imagen3.8 Exportar la representación como imagen
of_set_redrawAgrupar los cambios en un solo repintado3.10 Buenas prácticas
of_preload_iconsIconos mostrados sin retardoVisualización instantánea: of_icon
of_set_translationTraducir una etiqueta del componente5.2 Adaptar una etiqueta: of_set_translation
of_focus_webviewDar el foco al componente6.4 Teclado y foco
of_print · of_print_to_pdfImprimir, o escribir un PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar una propiedad por su nombre3.1 El motor de propiedades

Dos ayudas no se heredan: of_icon y of_escape_markup viven en n_pbt_utils. Declare uno — n_pbt_utils lnv_utils, nada que crear — y llámelas sobre él.


← Referencia de componentes · Índice de la guía