pdfviewer — u_pbt_pdfviewer #
← Referência dos componentes · Índice do guia
Visualizador de PDF integrado: apresenta um documento local ou publicado na web, diretamente na janela da aplicação, com paginação, zoom e impressão.
▶ Ver ao vivo — Aplicação de demonstração, mosaico PDF viewer: a pré-visualização, o código que o produz e esta página, lado a lado.
Em resumo #
| Userobject | u_pbt_pdfviewer |
| Classe de items | — (componente sem items) |
| Serve para | Apresentar uma fatura, uma nota de encomenda, um contrato ou um manual sem iniciar qualquer aplicação externa |
| Opções opt-in | — |
O componente substitui o clássico «gravar o PDF num ficheiro temporário e depois chamar ShellExecute»: o documento permanece dentro da aplicação e o utilizador nunca sai do ecrã em curso.
Início rápido #
// event open da janela : apresentar um documento presente no 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 apresentado"
É tudo: basta definir is_source para carregar e apresentar o documento.
Propriedades #
| Propriedade | Tipo | Predefinição | Função |
|---|---|---|---|
is_source | string | "" | Documento a apresentar: um caminho de ficheiro (absoluto, relativo à aplicação ou de rede; um # faz parte do nome), um endereço file:///, um endereço web https://… servido como application/pdf, ou um endereço data:application/pdf. Definir o valor desencadeia o carregamento; definir "" esvazia o visualizador. Tudo o resto é recusado e assinalado por ue_load_failed — http:// incluído. Relê-se tal como foi escrito |
ii_page | integer | 0 | Página apresentada, contada a partir de 1 (0 = a primeira página do documento). Uma página definida antes de is_source vale para esse documento; caso contrário, um novo documento abre na sua primeira página. Cada alteração recarrega o documento e volta a acionar ue_load_completed: o leitor só lê a sua página no carregamento. Apenas escrita: ao relê-la obtém a última página pedida, não a apresentada. O leitor é o do motor web e não comunica nada. |
ii_zoom | integer | 0 | Zoom em percentagem (0 = deixado ao leitor). Definir um zoom anula is_fit, que o contradiz. Apenas escrita, tal como ii_page: se o utilizador ampliar com a barra do leitor, esta propriedade não acompanha. |
is_fit | string | "" | Ajuste: FIT_PAGE, FIT_WIDTH, FIT_HEIGHT, ou "" para nenhum. Anula ii_zoom |
ib_viewer_toolbar | boolean | true | Apresenta a barra do próprio leitor (número de página, zoom, impressão, transferência). Oculte-a quando a sua janela tiver esses comandos |
ib_allow_save | boolean | true | Oferece os comandos Guardar e Guardar como da barra do leitor e do seu menu. A false, o documento é apresentado sem propor guardar uma cópia. Não é uma proteção: o ficheiro continua legível no disco. Cada alteração volta a carregar o documento apresentado |
ib_allow_print | boolean | true | Oferece o comando Imprimir da barra do leitor e do seu menu. of_print continua a imprimir: é a aplicação que decide. Cada alteração volta a carregar o documento apresentado |
is_theme_style | string | "" | Estilo visual do componente (constantes THEME_STYLE_*); vazio = o da aplicação, seguido a cada mudança |
is_theme_mode | string | "" | Variante clara ou escura (constantes THEME_MODE_*); vazio = a da aplicação, seguida a cada mudança |
il_theme_accent | long | -1 | Cor de destaque deste componente (-1 = destaque da aplicação, ou o do tema) |
Métodos #
| Método | Função |
|---|---|
of_refresh ( ) | Volta a ler o documento atual (do disco ou da rede) sem alterar as definições: o meio de apresentar um ficheiro regenerado no mesmo caminho. A posição de deslocamento não é conservada: o leitor recomeça em ii_page. Após uma falha, volta a tentar o mesmo documento. Um documento recusado é julgado de novo: ue_load_failed é novamente acionado. Devolve 0 uma vez pedido, -4 sem documento (is_source vazio), -2 se o componente não estiver criado |
of_print ( ) · of_print (boolean) | Abre a pré-visualização de impressão do documento — não da página que o enquadra. Devolve 0 depois de pedida a pré-visualização, -4 quando nenhum documento está apresentado, -2 se o componente não estiver criado. O argumento não tem efeito aqui: é sempre a pré-visualização do leitor PDF |
of_print_to_pdf (string) | Devolve -4 neste componente, sem escrever nada: a página impressa seria apenas a moldura do leitor, nunca o documento. O documento já é um PDF: copie o ficheiro de is_source |
of_reset ( ) | Esvazia o visualizador e repõe todas as propriedades nos respetivos valores predefinidos. Devolve 0 depois de aplicado, -2 se o componente não estiver criado |
of_set_redraw (boolean) | Agrupa uma sequência de modificações numa única representação. Devolve 0 depois de aplicado, -2 se o componente não estiver criado |
of_save_as_png (string) · of_save_as_jpg (string) | Exporta a representação como imagem. Devolve 0 depois de a imagem ser escrita, -4 se a escrita falhar, -2 se o componente não estiver criado |
Eventos #
| Evento | Acionado quando |
|---|---|
ue_load_completed (string as_source) | O documento está apresentado; as_source é is_source tal como foi escrito. Também acionado por of_refresh e por cada alteração de página, zoom, ajuste ou barra do leitor. Nunca acionado numa falha |
ue_load_failed (string as_source, string as_reason) | Não foi possível apresentar o documento; as_reason é uma das constantes REASON_* abaixo. O visualizador permanece vazio |
ue_link_clicked (string as_url) | O utilizador seguiu uma ligação do documento. O visualizador permanece no documento: abra as_url onde pretender (navegador do posto, webbrowser…). as_url é o endereço da ligação tal como está (https://…, mailto:…); uma ligação para um ficheiro local — mesmo relativa ao documento — chega como caminho em disco |
ue_ready ( ) | O componente terminou o carregamento; tudo o que foi enviado antes foi reproduzido |
ue_runtime_missing ( ) | O runtime WebView2 está ausente: o componente permanece vazio |
ue_bg_color (long al_color) | O componente calculou a cor de fundo do respetivo tema; o userobject já a adotou (backcolor) |
Porque é que um documento não é apresentado #
as_reason de ue_load_failed é uma destas constantes de u_pbt_pdfviewer. Um PDF reconhece-se assim: um ficheiro local tem a extensão .pdf e começa pela assinatura %PDF-; um documento remoto é servido com o tipo application/pdf (o único que o motor entrega ao seu leitor); um endereço data: anuncia application/pdf.
| Constante | Valor | Causa |
|---|---|---|
REASON_NOT_FOUND | "notfound" | Ficheiro ausente ou ilegível, endereço que responde 404 |
REASON_NOT_PDF | "notpdf" | Não é um PDF: ficheiro local sem a assinatura %PDF-, resposta remota que não é application/pdf, data: de outro tipo |
REASON_TOO_LARGE | "toolarge" | Ficheiro demasiado grande para este processo (acima de 64 MB em 32 bits, 512 MB em 64 bits), ou um endereço data: com mais de 2 MB de caracteres (cerca de 1,5 MB de PDF) |
REASON_INSECURE | "insecure" | http://: não suportado, sirva o documento em https:// |
REASON_UNSUPPORTED | "unsupported" | Outro tipo de endereço (ftp:, blob:…) |
REASON_NETWORK | "network" | Servidor inacessível, nome desconhecido, ligação cortada |
REASON_CERTIFICATE | "certificate" | Certificado do site inválido, expirado ou revogado |
REASON_AUTH | "auth" | O site ou o proxy pede uma autenticação |
REASON_HTTP | "http" | Outro erro do servidor (403, 500…) |
REASON_REFUSED | "refused" | O site recusa ser apresentado numa moldura, ou envia o PDF como transferência — o ficheiro não é transferido por isso |
REASON_FAILED | "failed" | Qualquer outra causa |
O que o utilizador pode fazer, sem uma linha de código #
O visualizador apresenta a sua barra de ferramentas integrada por cima do documento. Não é necessário programar nada: ela é fornecida e localizada pelo sistema.
| Ação | Como |
|---|---|
| Paginação | Roda do rato e barra de deslocamento, ou introdução direta do número de página no contador n / total |
| Zoom | Botões + / −, ajuste à página ou à largura |
| Pesquisa | O botão de pesquisa da barra de ferramentas, no texto do documento |
| Impressão | Botão de impressora da barra de ferramentas (pode ser ocultado com ib_allow_print), ou of_print a partir do seu código |
| Gravação | Botão de transferência, para guardar uma cópia do documento (pode ser ocultado com ib_allow_save) |
| Rotação | Rotação das páginas a partir do menu da barra de ferramentas |
| Teclado | Assim que o componente tem o foco (Tab ou of_focus_webview): PageDown, as setas, Home / End deslocam o documento, sem clique prévio |
Os atalhos do navegador — Ctrl+F, Ctrl+P, Ctrl + roda do rato — estão desativados em todos os componentes, este incluído: use os botões da barra do leitor.
O que o leitor não diz #
O leitor é o integrado no motor web: nada a instalar, impressão, pesquisa, formulários PDF e ecrã inteiro incluídos. Em contrapartida, não comunica nada à aplicação: nem a página apresentada, nem o número de páginas, nem o zoom real, nem o texto selecionado, e a pesquisa não se controla por código. ii_page e ii_zoom dizem onde abrir o documento, não onde o utilizador está. É uma escolha deliberada para a 4.0; uma apresentação programável exigiria uma biblioteca externa.
Exemplos #
Abrir um documento local #
// Caminho absoluto, ou relativo ao diretorio da aplicacao
uo_pdf.is_source = "doc\conditions-generales.pdf"
Abrir um documento publicado na web #
// Um endereco web carrega-se exatamente como um ficheiro local
uo_pdf.is_source = "https://www.monsite.fr/tarifs/catalogue-2026.pdf"
É evidentemente necessária uma ligação à internet; o carregamento é assíncrono e ue_load_completed assinala o fim.
Apresentar o PDF acabado de produzir por uma DataWindow #
// Local variables
string ls_file
// Um ficheiro por dia, na pasta temporaria
ls_file = "C:\temp\report_" + String(Today(), "yyyymmdd") + ".pdf"
// A DataWindow produz o ficheiro...
dw_report.SaveAs(ls_file, PDF!, false)
// ...e o visualizador apresenta-o imediatamente
uo_pdf.is_source = ls_file
Atualizar após a regeneração do ficheiro #
// O ficheiro foi reescrito no mesmo local : recarregar sem alterar is_source
uo_pdf.of_refresh()
Encadear vários documentos no mesmo visualizador #
// event ue_row_changed de dw_list : apresentar o anexo da linha atual
string ls_pdf
// O caminho do PDF da linha atual
ls_pdf = dw_list.GetItemString(dw_list.GetRow(), "pdf_path")
// Sem anexo o visualizador esvazia-se ; caso contrario mostra-o
if ls_pdf = "" then
uo_pdf.of_reset() // nenhum anexo : visualizador vazio
else
uo_pdf.is_source = ls_pdf
end if
Acompanhar o fim do carregamento #
// event ue_load_completed de uo_pdf : (string as_source)
uo_wait.Hide()
// of_print imprime o documento apresentado
uo_print_button.ib_enabled = true
Dizer porque é que o documento não está lá #
// 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 nao encontrado: " + as_source
case uo_pdf.REASON_NOT_PDF
uo_status.of_panel(/*key*/ "main").is_text = "Este ficheiro nao e um PDF"
case else
uo_status.of_panel(/*key*/ "main").is_text = "Documento indisponivel (" + as_reason + ")"
end choose
Abrir noutro lado uma ligação do documento #
// event ue_link_clicked de uo_pdf : (string as_url)
// O visualizador permanece no documento : a ligacao abre no navegador da janela
uo_web.is_address = as_url
Imprimir o documento #
// clicked do botao Imprimir : a pre-visualizacao do leitor PDF, sobre o proprio documento
if uo_pdf.of_print() = -4 then
uo_status.of_panel(/*key*/ "main").is_text = "Nenhum documento para imprimir"
end if
Mostrar sem deixar guardar nem imprimir #
// Um documento confidencial : nem Guardar nem Imprimir na barra do leitor
uo_pdf.ib_allow_save = false
uo_pdf.ib_allow_print = false
uo_pdf.is_source = is_current_document
Defina-as antes de is_source: cada alteração volta a carregar o documento. Não é uma proteção: o ficheiro continua legível no disco, e of_print continua a imprimir.
Pré-visualização num separador, ao lado da introdução de dados #
// event open : o visualizador ocupa uma pagina de separador, a introducao de dados a outra
uo_tab.of_add_page(/*key*/ "entry", /*title*/ "Introducao", /*page*/ uo_page_entry)
uo_tab.of_add_page(/*key*/ "preview", /*title*/ "Previsao", /*page*/ uo_page_preview)
// O visualizador esta colocado em uo_page_preview como qualquer outro controlo
uo_pdf.is_source = is_current_document
O componente aloja-se sem qualquer precaução especial num tab ou num painel dockcontainer.
Verificar o ficheiro antes de o apresentar #
// Local variables
string ls_path
// O ficheiro da fatura apresentada
ls_path = "C:\factures\" + is_number + ".pdf"
// Sem ficheiro, nada a mostrar : esvazia-se o visualizador em vez de deixar o documento anterior
if not FileExists(ls_path) then
uo_pdf.of_reset()
uo_status.of_panel(/*key*/ "main").is_text = "Fatura nao encontrada"
return
end if
// Caso contrario, a fatura e apresentada
uo_pdf.is_source = ls_path
Formatos e caminhos aceites #
Forma de is_source | Exemplo | Observação |
|---|---|---|
| Caminho absoluto | "C:\docs\contrat.pdf" | O mais fiável |
| Caminho relativo | "doc\notice.pdf" | Relativo ao diretório da aplicação |
| Caminho de rede | "\\serveur\partage\bon.pdf" | O utilizador tem de possuir direitos de leitura |
Nome com # | "C:\devis\Devis #12.pdf" | O # faz parte do nome do ficheiro |
Endereço file: | "file:///C:/docs/contrat.pdf" | Convertido em caminho, como um caminho absoluto; também file://localhost/C:/… e a forma UNC de quatro barras file:////servidor/partilha/… |
| Endereço web | "https://…/catalogue.pdf" | Servido como application/pdf, carregamento assíncrono. Um #page=… escrito no endereço é ignorado: utilize ii_page |
| Documento em memória | "data:application/pdf;base64,…" | Nada é escrito no disco. Acima de 2 MB de caracteres (cerca de 1,5 MB de PDF), ue_load_failed com REASON_TOO_LARGE: escreva o ficheiro e indique o seu caminho |
Endereço http:// | "http://intranet/bon.pdf" | Não suportado: ue_load_failed com REASON_INSECURE. Sirva o documento em https:// |
| Vazio | "" | Esvazia o visualizador |
Apenas o PDF é suportado por este componente: o resto é recusado e assinalado por ue_load_failed (REASON_NOT_PDF). Para uma imagem, deve utilizar-se picture; para uma página HTML, webbrowser.
Boas práticas #
- Vigiar
ue_load_failed: um caminho inválido, um ficheiro que não é um PDF ou um site inacessível é aí assinalado com a sua causa, e o visualizador permanece vazio. - Chamar
of_reset()quando já nenhum documento deve ser apresentado (mudança de linha sem anexo): caso contrário, o documento anterior permanece visível. of_refresh()é o meio de apresentar um ficheiro regenerado no mesmo caminho: volta a ler o ficheiro sem alterar as definições. Não conserva a posição de deslocamento — o leitor recomeça emii_page.- Cada alteração de
ii_page,ii_zoom,is_fitouib_viewer_toolbarrecarrega o documento (o leitor só lê as suas definições no carregamento) e volta a acionarue_load_completed: defina-as antes deis_sourcepara um único carregamento. - Prever um indicador de espera para os documentos remotos ou volumosos, e ocultá-lo em
ue_load_completede emue_load_failed. - Atribuir ao componente uma superfície confortável (pelo menos metade da janela): a barra de ferramentas integrada e o documento precisam de espaço para permanecerem legíveis.
- Para apresentar uma página web em vez de um PDF, deve utilizar-se webbrowser; para uma imagem, picture.
Herdado da base comum #
Estes membros existem em todos os componentes visuais — não são próprios deste. São detalhados uma só vez, nos capítulos transversais; esta tabela apenas diz onde os ler.
| Membros | Função | Detalhado em |
|---|---|---|
of_reset | Repor o componente a zero | 3.6 Repor um componente a zero: of_reset() |
of_register_shortcut · of_clear_shortcuts | Atalhos de teclado do componente | 3.5 Os atalhos de teclado |
of_is_created · of_is_ready · of_get_last_error | Se nasceu, se está pronto, o que falhou | 3.7 Diagnóstico |
of_save_as_png · of_save_as_jpg | Exportar a renderização como imagem | 3.8 Exportar a representação como imagem |
of_set_redraw | Agrupar as alterações num único repinte | 3.10 Boas práticas |
of_preload_icons | Ícones mostrados sem atraso | Apresentação instantânea: of_icon |
of_set_translation | Traduzir uma legenda do componente | 5.2 Adaptar uma etiqueta: of_set_translation |
of_focus_webview | Dar o foco ao componente | 6.4 Teclado e focus |
of_print · of_print_to_pdf | Imprimir, ou escrever um PDF | 6.9 Imprimir |
of_set_property · of_get_property · of_component_name | Controlar uma propriedade pelo nome | 3.1 O motor de propriedades |
Duas ajudas não são herdadas: of_icon e of_escape_markup vivem em n_pbt_utils. Declare um — n_pbt_utils lnv_utils, nada a criar — e chame-as nele.