PBToolboxAI v4 ← Site

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 #

Userobjectu_pbt_pdfviewer
Classe de items— (componente sem items)
Serve paraApresentar 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 #

PropriedadeTipoPredefiniçãoFunção
is_sourcestring""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_pageinteger0Pá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_zoominteger0Zoom 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_fitstring""Ajuste: FIT_PAGE, FIT_WIDTH, FIT_HEIGHT, ou "" para nenhum. Anula ii_zoom
ib_viewer_toolbarbooleantrueApresenta 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_savebooleantrueOferece 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_printbooleantrueOferece 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_stylestring""Estilo visual do componente (constantes THEME_STYLE_*); vazio = o da aplicação, seguido a cada mudança
is_theme_modestring""Variante clara ou escura (constantes THEME_MODE_*); vazio = a da aplicação, seguida a cada mudança
il_theme_accentlong-1Cor de destaque deste componente (-1 = destaque da aplicação, ou o do tema)

Métodos #

MétodoFunçã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 #

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

ConstanteValorCausa
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çãoComo
PaginaçãoRoda do rato e barra de deslocamento, ou introdução direta do número de página no contador n / total
ZoomBotões + / −, ajuste à página ou à largura
PesquisaO botão de pesquisa da barra de ferramentas, no texto do documento
ImpressãoBotão de impressora da barra de ferramentas (pode ser ocultado com ib_allow_print), ou of_print a partir do seu código
GravaçãoBotão de transferência, para guardar uma cópia do documento (pode ser ocultado com ib_allow_save)
RotaçãoRotação das páginas a partir do menu da barra de ferramentas
TecladoAssim 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_sourceExemploObservaçã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 #

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.

MembrosFunçãoDetalhado em
of_resetRepor o componente a zero3.6 Repor um componente a zero: of_reset()
of_register_shortcut · of_clear_shortcutsAtalhos de teclado do componente3.5 Os atalhos de teclado
of_is_created · of_is_ready · of_get_last_errorSe nasceu, se está pronto, o que falhou3.7 Diagnóstico
of_save_as_png · of_save_as_jpgExportar a renderização como imagem3.8 Exportar a representação como imagem
of_set_redrawAgrupar as alterações num único repinte3.10 Boas práticas
of_preload_iconsÍcones mostrados sem atrasoApresentação instantânea: of_icon
of_set_translationTraduzir uma legenda do componente5.2 Adaptar uma etiqueta: of_set_translation
of_focus_webviewDar o foco ao componente6.4 Teclado e focus
of_print · of_print_to_pdfImprimir, ou escrever um PDF6.9 Imprimir
of_set_property · of_get_property · of_component_nameControlar uma propriedade pelo nome3.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.


← Referência dos componentes · Índice do guia