Total de Páginas de um PDF (PageCount)
Finalmente uma rotina para obter o PageCount (Total de Páginas) de um Arquivo PDF
Olá a todos.
Após sofrer durante alguns dias sem retorno, buscando uma maneira de obter o PageCount de um PDF na internet resolvi meu problema e decidi publicar meu primeiro artigo.
é uma função simples que recebe como parametro o arquivo PDF (path) e retorna um integer com o total de páginas.
Utilizo uma rotina auxiliar que também segue abaixo:
Essa rotina auxiliar serve para remover o conteudo de uma String (S) a esquerda da substring (Sep)function TForm1.tbGetLongStr(const S: string; const Sep: String): string;
var
I: Integer;
begin
I := AnsiPos(Sep, S);
if I = 0 then
Result :=
else
Result := Copy(S, I, High(integer));
end;
Agora a Rotina Principal:
function TForm1.RetornaPaginasPDF(Arquivo: TFileName): Integer;
// Isso fará com que o Arquivo seja quebrado em blocos de 300 caracteres
type
TReg = packed record
cDados : array[01..300] of Char;
end;
var
Arq: File of TReg;
RegLido : TReg;
Linha, CopiaLinha, Aux: String;
oNumero, Posicao, i: Integer;
begin
Linha:= ;
oNumero:= 0;
AssignFile(Arq, Arquivo);
Reset(Arq);
While not Eof(Arq) do
begin
Read(Arq, RegLido); // Faz a leitura de cada bloco
//Copia o texto removendo caracteres que podem nos atrapalhar por exemplo quebra de linha
// se os 300 caracteres são atribuidos diretamente a variavel string, copiamos quebras de linha
// e isso gera erro para localização de nosso conteúdo.
for i:= 1 to 300 do
begin
if RegLido.cDados[i] in [A..Z, a..z, 0..9] then
Linha:= Linha + RegLido.cDados[i];
end;
// Se Localizei a palavra Count, encontrarei a Qtde de Páginas.
Posicao:= Pos(COUNT,UPPERCASE(Linha));
if (Posicao > 0) and (Posicao < (Length(Linha) - 20))then
begin
CopiaLinha:= Linha;
CopiaLinha:= tbGetLongStr(CopiaLinha,Count); // Remove conteudo à esquerda da palavra Count
CopiaLinha:= Copy(CopiaLinha,6,Length(CopiaLinha)); //Remove a palavra Count
// A partir desse ponto o inicio de nossa string é a qtde. de páginas, então vamos lendo
// caracter a caracter e assim que encontramos uma letra, encerramos a leitura
for i:= 1 to Length(CopiaLinha) do
begin
if (CopiaLinha[i] in [0..9]) then
Aux:= Aux + CopiaLinha[i]
else
Break;
end;
//devemos fazer a leitura até o final do arquivo, pois um arquivo PDF pode ter várias vezes
// a palavra Count com qtdes. diferentes, e ficamos com a maior.
if StrToInt(Aux) > oNumero then
oNumero:= StrToInt(Aux);
Aux:= ' ;
end;
//Se a palavra Count está no fim da string talvez a qtde de págs esteja em outra linha
// por isso copio os ultimos 20 caracteres para concatenar com a proxima linha
Linha:= Copy(Linha, Length(Linha) - 20, Length(Linha));
end;
CloseFile(Arq);
Result:= oNumero;
end;
Nos testes que eu fiz, rolou tudo certo. Espero que ajude quem precisar.
Até a próxima.
Felipe
Artigos relacionados
-
Artigo
-
Artigo
-
Artigo
-
Artigo
-
Artigo