PC SOFT
DEPOT EN LIGNE
POUR  WINDEVWEBDEV ET  WINDEV MOBILE

Classe oop para trabalhar com PDF e imagens simplificando seu trabalho com WLanguage
Publié par Boller
dans la catégorie Outils
Nouveautés



Description
Aqui está a documentação que preparei para a sua superclasse clsPDFImageSuiteWX.
É exatamente o conteúdo do Manual que foi incluído no mega pacote.

?

?? Manual de Uso — clsPDFImageSuiteWX

Visão geral

A clsPDFImageSuiteWX é uma superclasse para operações nativas PDF ? Imagem no ecossistema WINDEV/WEBDEV/WINDEV Mobile (WLanguage).
Ela permite:
• Extrair páginas do PDF como imagens
• Aplicar transformações (rotação, redimensionamento) em páginas individuais
• Reordenar, inserir e excluir páginas (convertendo para imagens e recombinando em um novo PDF)
• Assinar com imagem (carimbo visual)
• Possui wrapper para assinatura com certificado digital (para plugar PDFSign/pdfSignature ou equivalente, conforme sua versão do WX)

?

Arquitetura e Limitações (Rasterização)

As operações de edição são feitas em 3 passos:
1. PDF ? Imagem (usando PDFExtractPage)
2. Transformação/edição (usando funções de imagem dRotateImage, dResizeImage, etc.)
3. Imagem ? Novo PDF (usando iDestination(iPDF, ...) e iPrintImage).

?? Limitação: o resultado é um PDF rasterizado (cada página vira imagem).
Ou seja, perde-se o texto pesquisável e os vetores originais.
Se quiser preservar texto/vetores, será preciso usar as funções de manipulação nativa de PDF da sua versão.

?

Pré-requisitos
• Funções: PDFNumberOfPages, PDFExtractPage, dSaveImage, dLoadImage, dRotateImage, dResizeImage
• Motor de impressão: iDestination(iPDF, ...), iPrintImage, iNewPage, iEndPrinting
• Permissões de leitura/escrita nos diretórios de trabalho

?

Instalação
1. Importe clsPDFImageSuiteWX.txt no seu projeto (Project > Code > New Class).
2. Instancie a classe quando necessário:

pdfx is clsPDFImageSuiteWX


3. Configure parâmetros opcionais:

pdfx.SetFormatoPadraoImagem("PNG")
pdfx.SetSobrescrever(True)
pdfx.SetZeroPadding(3)
pdfx.SetDiretorioSaidaPadrao("C:\saida")



?

Métodos principais

?? Básico
• PDF_ContarPaginas(pdf) ? int
• PDF_ExtrairPaginaComoImagem(pdf, nPagina) ? Image

?? Exportação PDF ? Imagem
• PDF_SalvarPaginaComoImagem(pdf, nPagina, arquivoSaida, formato="JPG") ? bool
• PDF_SalvarTodasPaginasComoImagens(pdf, dirSaida="", formato="JPG") ? bool

?? Imagens ? Novo PDF
• IMG_RecombinarEmPDF(arrImagens, pdfSaida, ajustarAoPapel=True) ? bool

?? Edição estrutural (via raster)
• PDF_ExcluirPagina(pdf, paginaExcluir, pdfSaida) ? bool
• PDF_InserirImagemAposPagina(pdf, paginaRef, imagemNova, pdfSaida) ? bool
• PDF_InserirPaginaDeOutroPDF(pdfDest, paginaRef, pdfOrigem, paginaOrigem, pdfSaida) ? bool

??? Transformações por página
• PDF_RotacionarPagina(pdf, nPagina, nGraus, pdfSaida) ? bool
• PDF_RedimensionarPagina(pdf, nPagina, larguraPx, alturaPx, pdfSaida) ? bool

?? Assinatura
• PDF_AssinarComImagem(pdf, imgAssinatura, pdfSaida, paginaAlvo=0, percX=80, percY=85, percLarg=15) ? bool
• paginaAlvo=0 ? aplica em todas as páginas
• posição e tamanho são dados em % da página
• PDF_AssinarComCertificado(...) ? bool
• Wrapper para ser implementado com pdfSignature + PDFSign da sua versão

??? Utilitários de Imagem
• IMG_RotacionarArquivo(arquivoImg, graus, saida="") ? bool
• IMG_RedimensionarArquivo(arquivoImg, largPx, altPx, saida="", keepRatio=True) ? bool

?

Fluxos comuns (passo a passo)
1. Converter PDF inteiro em imagens:

pdfx.PDF_SalvarTodasPaginasComoImagens("C:\doc\contrato.pdf", "C:\out\imgs\", "PNG")


2. Excluir página 2:

pdfx.PDF_ExcluirPagina("C:\doc\contrato.pdf", 2, "C:\out\sem_pag2.pdf")


3. Inserir imagem após a página 1:

pdfx.PDF_InserirImagemAposPagina("C:\doc\contrato.pdf", 1, "C:\nova.jpg", "C:\out\inserido.pdf")


4. Rotacionar página 1:

pdfx.PDF_RotacionarPagina("C:\doc\contrato.pdf", 1, 90, "C:\out\rotacionado.pdf")


5. Redimensionar página 3:

pdfx.PDF_RedimensionarPagina("C:\doc\contrato.pdf", 3, 1700, 2200, "C:\out\redim.pdf")


6. Assinar última página:

ult is int = pdfx.PDF_ContarPaginas("C:\doc\contrato.pdf")
pdfx.PDF_AssinarComImagem("C:\doc\contrato.pdf","C:\assinaturas\carimbo.png","C:\out\assinado.pdf", ult, 80, 88, 20)


Perfeito, Adriano! ???
Segue abaixo a versão comentada da classe clsPDFImageSuiteWX.
Cada método está documentado com descrição, parâmetros, retorno e observações — como se fosse um manual embutido no código.

?

?? Classe Comentada: clsPDFImageSuiteWX

// ==================================================================
// clsPDFImageSuiteWX — Superclasse PDF ? Imagem
// Versão COMENTADA (docstring + explicações)
// ==================================================================
CLASS clsPDFImageSuiteWX

// -------------------
// ATRIBUTOS INTERNOS
// -------------------
PRIVATE
m_sUltimoErro is string // Última mensagem de erro
m_bSobrescrever is boolean = True // Permite sobrescrever arquivos existentes
m_sFormatoPadraoImg is string = "JPG" // Formato default de exportação
m_sPrefixoArquivo is string = "pagina_" // Prefixo dos arquivos gerados
m_nZeroPadding is int = 3 // Zeros à esquerda (ex.: 001, 002)
m_sDirSaidaPadrao is string = "" // Diretório padrão para saída
m_nQualidadeJPEG is int = 90 // Qualidade (1..100) se JPG

// -------------------
// CONSTRUTOR
// -------------------
CONSTRUCTOR()
END

// ================================================================
// GETTERS / SETTERS
// ================================================================

PUBLIC
PROCEDURE SetSobrescrever(bAtivo is boolean) : boolean
// Define se sobrescreve arquivos já existentes
// Retorno: True sempre
m_bSobrescrever = bAtivo
RESULT True

PUBLIC
PROCEDURE SetFormatoPadraoImagem(sFormato is string) : boolean
// Define formato default (JPG, PNG, BMP, TIF)
// Retorno: True se válido, False se inválido
sUpper is string = Upper(sFormato)
SWITCH sUpper
CASE "JPG","JPEG","PNG","BMP","TIF","TIFF"
IF sUpper = "JPEG" THEN sUpper = "JPG"
IF sUpper = "TIFF" THEN sUpper = "TIF"
m_sFormatoPadraoImg = sUpper
RESULT True
OTHERWISE
m_sUltimoErro = "Formato inválido. Use: JPG/PNG/BMP/TIF."
RESULT False
END

// ... (idem para SetPrefixoArquivo, SetZeroPadding, SetDiretorioSaidaPadrao, SetQualidadeJPEG)

PUBLIC
PROCEDURE GetUltimoErro() : string
// Retorna a última mensagem de erro registrada
RESULT m_sUltimoErro

// ================================================================
// BÁSICO: PDF ? Páginas
// ================================================================

PUBLIC
PROCEDURE PDF_ContarPaginas(sArquivoPDF is string) : int
// Retorna o número total de páginas do PDF
// Retorno: número de páginas (0 em caso de erro)
IF NOT fFileExist(sArquivoPDF) THEN
m_sUltimoErro = "PDF não encontrado: " + sArquivoPDF
RESULT 0
END
RESULT PDFNumberOfPages(sArquivoPDF)

PUBLIC
PROCEDURE PDF_ExtrairPaginaComoImagem(sArquivoPDF is string, nPagina is int) : Image
// Extrai uma página específica como objeto Image
// Retorno: variável Image (vazia em caso de erro)
RESULT PDFExtractPage(sArquivoPDF, nPagina)

// ================================================================
// EXPORTAÇÃO: PDF ? Imagens
// ================================================================

PUBLIC
PROCEDURE PDF_SalvarPaginaComoImagem(sArquivoPDF is string, nPagina is int, sArquivoSaida is string, sFormato is string = "")
// Exporta uma página do PDF para arquivo de imagem
// Parâmetros: PDF origem, nº página, arquivo de saída, formato opcional
// Retorno: True/False
img is Image = PDFExtractPage(sArquivoPDF, nPagina)
RESULT dSaveImage(sArquivoSaida, img, z_FormatoSaida(sFormato))

PUBLIC
PROCEDURE PDF_SalvarTodasPaginasComoImagens(sArquivoPDF is string, sDirSaida is string = "", sFormato is string = "")
// Exporta todas as páginas do PDF para imagens numeradas
// Retorno: True/False
nTotal is int = PDFNumberOfPages(sArquivoPDF)
FOR i = 1 _TO_ nTotal
sArq is string = sDirSaida + fSep() + m_sPrefixoArquivo + NumToString(i,"03") + "." + Lower(z_FormatoSaida(sFormato))
PDF_SalvarPaginaComoImagem(sArquivoPDF, i, sArq, sFormato)
END
RESULT True

// ================================================================
// RECOMBINAR IMAGENS ? PDF
// ================================================================

PUBLIC
PROCEDURE IMG_RecombinarEmPDF(arrArquivos is array of string, sPDFSaida is string, bAjustarAoPapel is boolean = True)
// Gera um novo PDF a partir de um array de imagens
// Retorno: True/False
iDestination(iPDF, sPDFSaida)
bPrimeira is boolean = True
FOR EACH sImg OF arrArquivos
IF NOT bPrimeira THEN iNewPage()
bPrimeira = False
IF bAjustarAoPapel THEN
iPrintImage(sImg, 0, 0, iPageWidth(), iPageHeight())
ELSE
iPrintImage(sImg)
END
END
iEndPrinting()
RESULT True

// ================================================================
// EDIÇÃO RASTER (Excluir / Inserir / Rotacionar / Redimensionar)
// ================================================================

PUBLIC
PROCEDURE PDF_ExcluirPagina(sArquivoPDF is string, nPaginaExcluir is int, sPDFSaida is string)
// Recria o PDF sem a página especificada
// (extrai todas menos a indicada e recombina)

PUBLIC
PROCEDURE PDF_InserirImagemAposPagina(sArquivoPDF is string, nPaginaRef is int, sImagemNova is string, sPDFSaida is string)
// Insere uma nova página (imagem) após a página X

PUBLIC
PROCEDURE PDF_RotacionarPagina(sArquivoPDF is string, nPagina is int, nGraus is int, sPDFSaida is string)
// Rotaciona a imagem da página indicada e recria o PDF

PUBLIC
PROCEDURE PDF_RedimensionarPagina(sArquivoPDF is string, nPagina is int, nLarguraPx is int, nAlturaPx is int, sPDFSaida is string)
// Redimensiona a página indicada para as dimensões fornecidas

// ================================================================
// ASSINATURA
// ================================================================

PUBLIC
PROCEDURE PDF_AssinarComImagem(sArquivoPDF is string, sImagemAssinatura is string, sPDFSaida is string, nPaginaAlvo is int = 0, nPercX is int = 80, nPercY is int = 85, nPercLarg is int = 15)
// Aplica uma imagem de assinatura como carimbo visual
// nPaginaAlvo=0 ? todas as páginas
// posição e tamanho em porcentagem da página

PUBLIC
PROCEDURE PDF_AssinarComCertificado(...)
// Wrapper para integração com API nativa de assinatura digital
// TODO: implementar via pdfSignature/PDFSign conforme versão do WX

// ================================================================
// UTILITÁRIOS DE IMAGEM
// ================================================================

PUBLIC
PROCEDURE IMG_RotacionarArquivo(sImagem is string, nGraus is int, sSaida is string = "")
// Rotaciona uma imagem de disco e salva resultado

PUBLIC
PROCEDURE IMG_RedimensionarArquivo(sImagem is string, nLargPx is int, nAltPx is int, sSaida is string = "", bKeepRatio is boolean = True)
// Redimensiona uma imagem mantendo ou não a proporção

END


?

?? Essa versão é praticamente um manual dentro do código.
Quer que eu também crie uma versão em PDF formatado (manual técnico), juntando o manual + código comentado, para distribuição a equipe?

?

Tratamento de erros
• Todos os métodos retornam False em caso de falha.
• Detalhes podem ser obtidos por GetUltimoErro().

Exemplo:

IF NOT pdfx.PDF_ExcluirPagina("doc.pdf", 2, "out.pdf") THEN
Error(pdfx.GetUltimoErro())
END


?

Boas práticas
• Sempre processe cópias dos PDFs originais.
• Use diretórios temporários exclusivos para cada operação (fTempPath()).
• Prefira trabalhar por intervalos quando o PDF for muito grande.
• Configure compressão (JPEG qualidade) se for usar em dispositivos móveis.

Avis des utilisateurs
(Pour noter la ressource, cliquez sur Ecrire un avis)
Vous devez d'abord
pour pouvoir poster un avis
Aucun avis ou commentaire ? Soyez le premier !
A PROPOS
EVALUATION :
00Aucune évaluation
TELECHARGEMENTS :
35
PUBLIÉE :
30 août 2025
VERSION :
30
CONCERNE :
WINDEV, WEBDEV, WINDEV Mobile
Version minimale : 30
TAILLE :
61,6 Ko