Duvida STRING PDF Topic is solved

Tire suas dúvidas sobre programação em AutoHotkey

Moderator: Gio

thalesduarte
Posts: 95
Joined: 13 Sep 2021, 06:08

Duvida STRING PDF

Post by thalesduarte » 25 Oct 2021, 12:21

Olá, bom dia.
Gostaria de tirar uma dúvida a respeito de como posso utilizar ComObjCreate("AcroExch.App") para retirar uma string de um pdf e colar em uma planilha.

A minha idéia é o script ler arquivo por arquivo em uma pasta contendo diversos PDF's, abrir cada pdf, retirar dados desse pdf e colar em uma planilha do excell.


Já possuo a versão premium do adobe acrobat, porém não consigo ter inicio de fazer essa verificação de string no arquivo.

Alguém pode me dar uma luz?
pedro45_vs
Posts: 39
Joined: 28 Jun 2020, 18:46

Re: Duvida STRING PDF

Post by pedro45_vs » 28 Oct 2021, 12:50

Uma forma que eu uso para ler strings de PDF é converter com o programa pdftotext.exe e então ler o arquivo gerado.

Cheguei até a fazer uma função para facilitar o processo.

Code: Select all

; site para download e documentação https://www.xpdfreader.com/pdftotext-man.html
; Passe o caminho do arquivo para a função por exemplo
; texto := pdf2var("D:\Documentos\arquivo.pdf")

pdf2var(PdfPath) {
	FileDelete, %A_Temp%\temp_pdf.txt
	RunWait "D:\Documentos\Scripts\Outros\pdftotext.exe" -q "%PdfPath%" %A_Temp%\temp_pdf.txt, , hide
	if (ErrorLevel != 0)
		MsgBox, 48, Função pdf2var, Ocorreu um erro ao executar pdftotext.exe 
	FileRead, text, %A_Temp%\temp_pdf.txt           ; Achei mais simples salvar o arquivo em uma pasta temporária para ler em seguida.
	FileDelete, %A_Temp%\temp_pdf.txt
	return text
}
thalesduarte
Posts: 95
Joined: 13 Sep 2021, 06:08

Re: Duvida STRING PDF

Post by thalesduarte » 04 Nov 2021, 09:45

Peço desculpas por minha ignorancia.

Mas como posso colocar isso na pratica?

Exemplo:

Queria tirar de um PDF alguns campos especificos e jogar para uma planilha, só que consiga fazer isso de forma massiva

Tenho 100 pdf's em uma pasta, ambos com semelhanças iguais, apenas os dados em alguns campos são diferentes, o meu objetivo é, fazer algum código ou alguma maneira do script abrir cada pdf, retirar os dados, jogar em uma planilha, e fazer isso até que todos os pdf's fossem tirados esses dados.
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Duvida STRING PDF

Post by Gio » 04 Nov 2021, 10:08

Bom dia Thalesduarte.

O PdftoText é um alicativo de linha de comando (controlável através do CMD, ou no caso do AutoHotkey, ComSpec) que transforma um arquivo .pdf em um arquivo .txt. Naturalmente, ele faz isso lendo todo o conteúdo textual do arquivo e escrevendo o arquivo de texto, descartando imagens e outros elementos não-textuais. Esse aplicativo é grátis e vem embutido em algumas distribuições do Linux, mas não é um aplicativo nativo no Windows. Mesmo assim, você pode instalá-lo através do aplicativo XPDF (quando você instala o XPDF, ele automaticamente instala o PdfTotext na sua máquina).

OBS: Conforme dito, eu já usei o pdftotext antes e considero ele um programa confiável, mas lembre-se que não nos responsabilizamos por nenhum aplicativo de terceiros (instale sempre por sua própria conta e risco).

Após instalar o pdftotext você pode usar ele para processar os arquivos pdf em arquivos txt, conforme mencionado, usando linhas de comando.

:arrow: A ideia então é que seu aplicativo primeiro acione o pdftotext (usando RunWait, conforme o código do Pedro45_vs ou ComSpec) e depois acesse o arquivo de texto que ele criou (usando FileRead), lendo então o conteúdo deste arquivo. Logo, indiretamente você vai estar lendo o conteúdo textual do próprio arquivo pdf. Depois disso, o passo seguinte seria simplesmente usar comandos String ou RegExMatch() para isolar as informações desejadas.

Isso pode ser feito em um loop de arquivos, de modo a processar os 100 arquivos de maneira sequencial.
thalesduarte
Posts: 95
Joined: 13 Sep 2021, 06:08

Re: Duvida STRING PDF

Post by thalesduarte » 04 Nov 2021, 12:15

Gio
Boa tarde.
Obrigado pelo retorno.
Gostaria de um auxilio no caso de regex.


Você indicaria algum tutorial de regex?

Consegui realizar a conversão, mas ainda não consegui entender como funciona o regex para captar os textos depois de uma condição

no meu formulario sempre terá
Valor total R$: 14.592,82
a unica coisa que irá ser alterada é só o valor.

como faço com regex para ele capturar somente depois do : ?
User avatar
Gio
Posts: 1247
Joined: 30 Sep 2013, 10:54
Location: Brazil

Re: Duvida STRING PDF  Topic is solved

Post by Gio » 04 Nov 2021, 17:20

Boa tarde Thalesduarte.

Você pode usar o guia rápido de RegEx se precisar criar uma RegEx.

Vou te dar um exemplo semelhante ao que você descreveu:

Exemplo de código Isolando qualquer quantidade de sequencias com o padrão desejado em um arquivo de texto que contém 3 valores:

Code: Select all

#Persistent

; Primeiro vamos criar uma amostra de texto que contenha o padrão desejado repetido 3x.
Texto_inteiro =
(
arquivo de exemplo número 4
data: xx/xx/xxxx
empresa: abc materiais elétricos ltda

cliente: jonas
hora da compra: 15:59
produto: escova de dentes amarela com tufo azul modelo dinossauros
unidade: caixa
quantidade: 2
valor unitário R$: 7.296,41
Valor total R$: 14.592,82

cliente: maria
hora da compra: 16:36
produto: régua escolar 30cm
unidade: caixa
quantidade: 3
valor unitário R$: 8.726,40
Valor total R$: 26.179,20

cliente: claudio
hora da compra: 16:50
produto: unidades de cd-rom antigos
unidade: caixa
quantidade: 2
valor unitário R$: 3.710,40
Valor total R$: 7.420,80
)

; A rotina para buscar os correspondentes-de-padrão desejados inicia aqui.

Total_De_Resultados := 0 ; Iniciamos uma variável de contagem
While (StrLen(Texto_inteiro) > 0) ; E depois um loop que roda enquanto o texto ainda existe (Lógica: o texto será cortado até a posição + 14 sempre que um valor for encontrado para que o loop reinicie. naturalmente, uma hora não haverá mais padrões, ponto onde terminaremos o loop)
{
	Posicao := RegExMatch(Texto_inteiro, "Valor\stotal\sR\$:\s\d{1,3}\.\d{1,3},\d{1,2}", Resultado)  ; Nosso padrão será: "Valor" seguido de um espaço, seguido de "total", seguido de outro espaço, seguido de "R$", seguido de dois pontos, seguido de um espaço, seguido de uma sequência de 1 a 3 dígitos numéricos, seguido de um ponto, seguido de uma sequência de 1 a 3 dígitos numéricos, seguido de uma vírgula, seguido de uma sequência de 1 a 2 dígitos numéricos. Isso vai pegar números até 999.999,99
	If !(Posicao > 0) ; Se a posição NÃO for maior que zero, então o comando não encontrou o padrão.
	{
		Posicao := RegExMatch(Texto_inteiro, "Valor\stotal\sR\$:\s\d{1,3},\d{1,2}", Resultado) ; Se isso ocorreu, buscamos OUTRO padrão semelhante (números até 999,99).
		If !(Posicao > 0) ; Se este padrão também não foi encontrado...
		{
			Break ; Terminamos o loop.
		}
	}
	Resultado_%A_index% := Resultado ; Este código executa obviamente se algum padrão acima foi encontrado. Primeiro, salva o correspondete-de-padrão encontrado.
	Total_De_Resultados++ ; Depois, aumenta o contagem de resultados.
	QUANTIDADE_DE_CARACTERES_A_REMOVER := Posicao + 14 ; Agora conta a posição do correspondente-de-padrão encontrado + 14 ("valor total R$" contém 14 caracteres, e faz parte do padrão. O objetivo é cortar até esses caracteres para que a próxima busca não encontra o mesmo correspondente-de-padrão)
	StringTrimLeft, Texto_inteiro, Texto_inteiro, %QUANTIDADE_DE_CARACTERES_A_REMOVER% ; Por fim, remove caracteres do texto original correspondente à posição do correspondente-de-padrão encontrado anteriormente para que o mesmo correspondente-de-padrão não seja encontrado de novo.
}

Loop % Total_De_Resultados ; Por fim fazemos um loop com a contagem de resultados.
{
	msgbox % Resultado_%A_index% ; e exibimos os resultados encontrados.
}
thalesduarte
Posts: 95
Joined: 13 Sep 2021, 06:08

Re: Duvida STRING PDF

Post by thalesduarte » 05 Nov 2021, 05:57

Gio, obrigado pelo empenho e ajuda no conhecimento.

Confesso que após sua orientação eu dei uma pesquisada e acabei conseguindo o resultado que estava buscando.

De qualquer forma, o exemplo que você me mostrou agora, me serviu bastante para conhecimentos e como aplicar o uso do Regex.
Mais uma vez, agradeço pela ajuda.

Encontrei um site chamado https://regex101.com/

Com ele eu consegui realizar alguns experimentos com regex e consegui o resultado esperado.

Grato pela atenção!

Atenciosamente,
Thales
Post Reply

Return to “Ajuda e Suporte Geral”