PC SOFT
ONLINE  REPOSITORY
FOR  WINDEVWEBDEV AND  WINDEV MOBILE

Classe oop para trabalhar com PDF e imagens simplificando seu trabalho com WLanguage
Published by Boller
in the category Tools
New features



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.

User reviews
(To evaluate this resource, click 'Write a review')
You must
to post a review
No review or comment? Be the first one!
ABOUT
RATING:
00No rating
DOWNLOADS:
35
PUBLISHED:
August 30, 2025
VERSION:
30
CONCERNS:
WINDEV, WEBDEV, WINDEV Mobile
Minimum version: 30
SIZE:
61.6 KB