Total de Páginas de um PDF (PageCount)

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (7)  (2)

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

 
Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Receba nossas novidades
Ficou com alguma dúvida?