Trabalhando com arquivos PDF em Python

Trabalhando com arquivos PDF em Python

Todos vocês devem estar familiarizados com o que são PDFs. Na verdade, eles são uma das mídias digitais mais importantes e amplamente utilizadas. PDF significa Formato de documento portátil . Ele usa .pdf extensão. É usado para apresentar e trocar documentos de forma confiável, independente de software, hardware ou sistema operacional.
Inventado por Adobe PDF é agora um padrão aberto mantido pela Organização Internacional de Padronização (ISO). PDFs podem conter links e botões, campos de áudio, vídeo e lógica de negócios.
Neste artigo aprenderemos como podemos realizar várias operações como:
 

  • Extraindo texto de PDF
  • Girando páginas PDF
  • Mesclando PDFs
  • Divisão de PDF
  • Adicionando marca d’água em páginas PDF

Instalação: Usando scripts python simples!
Estaremos usando um módulo pypdf de terceiros.
pypdf é uma biblioteca python construída como um kit de ferramentas PDF. É capaz de:
 

  • Extraindo informações do documento (autor do título…)
  • Dividir documentos página por página
  • Mesclando documentos página por página
  • Cortar páginas
  • Mesclando várias páginas em uma única página
  • Criptografando e descriptografando arquivos PDF
  • e muito mais!

Para instalar o pypdf, execute o seguinte comando na linha de comando:

 pip install pypdf  

Este nome de módulo diferencia maiúsculas de minúsculas, portanto, certifique-se de que o e é minúscula e todo o resto é maiúsculo. Todos os códigos e arquivos PDF usados ​​neste tutorial/artigo estão disponíveis aqui .

1. Extraindo texto de arquivo PDF

Python
   # importing required classes   from   pypdf   import   PdfReader   # creating a pdf reader object   reader   =   PdfReader  (  'example.pdf'  )   # printing number of pages in pdf file   print  (  len  (  reader  .  pages  ))   # creating a page object   page   =   reader  .  pages  [  0  ]   # extracting text from page   print  (  page  .  extract_text  ())   

A saída do programa acima é semelhante a esta:
 

 20   
PythonBasics
S.R.Doty
August272008
Contents

1Preliminaries
4
1.1WhatisPython?...................................
..4
1.2Installationanddocumentation....................
.........4 [and some more lines...]

Vamos tentar entender o código acima em partes:
 

 reader = PdfReader('example.pdf')   
  • Aqui criamos um objeto de Leitor de PDF classe do módulo pypdf e passe o caminho para o arquivo PDF e obtenha um objeto leitor de PDF.
     
 print(len(reader.pages))   
  • páginas propriedade fornece o número de páginas no arquivo PDF. Por exemplo, no nosso caso é 20 (veja a primeira linha da saída).
     
 pageObj = reader.pages[0]   
  • Agora criamos um objeto de PageObject classe do módulo pypdf. Objeto leitor de PDF tem função páginas[] que recebe o número da página (começando no índice 0) como argumento e retorna o objeto da página.
     
 print(pageObj.extract_text())   
  • O objeto da página tem função extrair_texto() para extrair texto da página PDF.


Observação: Embora os arquivos PDF sejam ótimos para organizar o texto de uma forma que seja fácil para as pessoas imprimirem e lerem, eles não são fáceis de serem analisados ​​pelo software em texto simples. Como tal, o pypdf pode cometer erros ao extrair texto de um PDF e pode até mesmo não conseguir abrir alguns PDFs. Não há muito que você possa fazer sobre isso, infelizmente. pypdf pode simplesmente não conseguir trabalhar com alguns de seus arquivos PDF específicos.

2. Rotação de páginas PDF
 

Python
   # importing the required classes   from   pypdf   import   PdfReader     PdfWriter   def   PDFrotate  (  origFileName     newFileName     rotation  ):   # creating a pdf Reader object   reader   =   PdfReader  (  origFileName  )   # creating a pdf writer object for new pdf   writer   =   PdfWriter  ()   # rotating each page   for   page   in   range  (  len  (  reader  .  pages  )):   pageObj   =   reader  .  pages  [  page  ]   pageObj  .  rotate  (  rotation  )   # Add the rotated page object to the PDF writer   writer  .  add_page  (  pageObj  )   # Write the rotated pages to the new PDF file   with   open  (  newFileName     'wb'  )   as   newFile  :   writer  .  write  (  newFile  )   def   main  ():   # original pdf file name   origFileName   =   'example.pdf'   # new pdf file name   newFileName   =   'rotated_example.pdf'   # rotation angle   rotation   =   270   # calling the PDFrotate function   PDFrotate  (  origFileName     newFileName     rotation  )   if   __name__   ==   '__main__'  :   # calling the main function   main  ()   

Aqui você pode ver como a primeira página do rotacionado_exemplo.pdf parece (imagem à direita) após a rotação:

Girando um arquivo PDF

Alguns pontos importantes relacionados ao código acima:
 

  • Para rotação, primeiro criamos um objeto leitor de PDF do PDF original.
 writer = PdfWriter()   
  • As páginas giradas serão gravadas em um novo PDF. Para escrever em PDFs usamos o objeto de PDFWriter classe do módulo pypdf.
 for page in range(len(pdfReader.pages)):   
pageObj = pdfReader.pages[page]
pageObj.rotate(rotation)
writer.add_page(pageObj)
  • Agora iteramos cada página do PDF original. Obtemos o objeto da página por .páginas[] método da classe de leitor de PDF. Agora giramos a página girar() método da classe de objeto de página. Em seguida, adicionamos uma página ao objeto PDF Writer usando adicionar() método da classe PDF Writer, passando o objeto de página girada.
 newFile = open(newFileName 'wb')   
writer.write(newFile)
newFile.close()
  • Agora temos que gravar as páginas PDF em um novo arquivo PDF. Primeiramente, abrimos o novo objeto de arquivo e escrevemos páginas PDF nele usando escrever() método do objeto PDF Writer. Finalmente fechamos o objeto de arquivo PDF original e o novo objeto de arquivo.

3. Mesclando arquivos PDF

Python
   # importing required modules   from   pypdf   import   PdfWriter   def   PDFmerge  (  pdfs     output  ):   # creating pdf file writer object   pdfWriter   =   PdfWriter  ()   # appending pdfs one by one   for   pdf   in   pdfs  :   pdfWriter  .  append  (  pdf  )   # writing combined pdf to output pdf file   with   open  (  output     'wb'  )   as   f  :   pdfWriter  .  write  (  f  )   def   main  ():   # pdf files to merge   pdfs   =   [  'example.pdf'     'rotated_example.pdf'  ]   # output pdf file name   output   =   'combined_example.pdf'   # calling pdf merge function   PDFmerge  (  pdfs  =  pdfs     output  =  output  )   if   __name__   ==   '__main__'  :   # calling the main function   main  ()   

A saída do programa acima é um PDF combinado combinado_exemplo.pdf obtido pela fusão exemplo.pdf e rotacionado_exemplo.pdf .
 

  • Vamos dar uma olhada em aspectos importantes deste programa:
     
 pdfWriter = PdfWriter()  
  • Para mesclar, usamos uma classe pré-construída PDFWriter do módulo pypdf.
    Aqui criamos um objeto escritor de pdf da aula de escritor de PDF
  # appending pdfs one by one   
for pdf in pdfs:
pdfWriter.append(pdf)
  • Agora anexamos o objeto de arquivo de cada PDF ao objeto PDF Writer usando o acrescentar() método.
  # writing combined pdf to output pdf file   
with open(output 'wb') as f:
pdfWriter.write(f)
  • Finalmente, escrevemos as páginas PDF no arquivo PDF de saída usando escrever método do objeto PDF Writer.

4. Divisão de arquivo PDF

Python
   # importing the required modules   from   pypdf   import   PdfReader     PdfWriter   def   PDFsplit  (  pdf     splits  ):   # creating pdf reader object   reader   =   PdfReader  (  pdf  )   # starting index of first slice   start   =   0   # starting index of last slice   end   =   splits  [  0  ]   for   i   in   range  (  len  (  splits  )  +  1  ):   # creating pdf writer object for (i+1)th split   writer   =   PdfWriter  ()   # output pdf file name   outputpdf   =   pdf  .  split  (  '.pdf'  )[  0  ]   +   str  (  i  )   +   '.pdf'   # adding pages to pdf writer object   for   page   in   range  (  start    end  ):   writer  .  add_page  (  reader  .  pages  [  page  ])   # writing split pdf pages to pdf file   with   open  (  outputpdf     'wb'  )   as   f  :   writer  .  write  (  f  )   # interchanging page split start position for next split   start   =   end   try  :   # setting split end position for next split   end   =   splits  [  i  +  1  ]   except   IndexError  :   # setting split end position for last split   end   =   len  (  reader  .  pages  )   def   main  ():   # pdf file to split   pdf   =   'example.pdf'   # split page positions   splits   =   [  2    4  ]   # calling PDFsplit function to split pdf   PDFsplit  (  pdf     splits  )   if   __name__   ==   '__main__'  :   # calling the main function   main  ()   

A saída serão três novos arquivos PDF com divisão 1 (página 01) divisão 2 (página 23) divisão 3 (final da página 4) .
Nenhuma nova função ou classe foi usada no programa python acima. Usando lógica simples e iterações, criamos as divisões do PDF passado de acordo com a lista passada divisões .

5. Adicionando marca d'água às páginas PDF

Python
   # importing the required modules   from   pypdf   import   PdfReader     PdfWriter   def   add_watermark  (  wmFile     pageObj  ):   # creating pdf reader object of watermark pdf file   reader   =   PdfReader  (  wmFile  )   # merging watermark pdf's first page with passed page object.   pageObj  .  merge_page  (  reader  .  pages  [  0  ])   # returning watermarked page object   return   pageObj   def   main  ():   # watermark pdf file name   mywatermark   =   'watermark.pdf'   # original pdf file name   origFileName   =   'example.pdf'   # new pdf file name   newFileName   =   'watermarked_example.pdf'   # creating pdf File object of original pdf   pdfFileObj   =   open  (  origFileName     'rb'  )   # creating a pdf Reader object   reader   =   PdfReader  (  pdfFileObj  )   # creating a pdf writer object for new pdf   writer   =   PdfWriter  ()   # adding watermark to each page   for   page   in   range  (  len  (  reader  .  pages  )):   # creating watermarked page object   wmpageObj   =   add_watermark  (  mywatermark     reader  .  pages  [  page  ])   # adding watermarked page object to pdf writer   writer  .  add_page  (  wmpageObj  )   # writing watermarked pages to new file   with   open  (  newFileName     'wb'  )   as   newFile  :   writer  .  write  (  newFile  )   # closing the original pdf file object   pdfFileObj  .  close  ()   if   __name__   ==   '__main__'  :   # calling the main function   main  ()   

Esta é a aparência da primeira página do arquivo PDF original (esquerda) e com marca d'água (direita):
 

Marca d

  • Todo o processo é igual ao exemplo de rotação de página. A única diferença é:
     
 wmpageObj = add_watermark(mywatermark pdfReader.pages[page])   
  • O objeto de página é convertido em objeto de página com marca d'água usando add_marca d’água() função.
  • Vamos tentar entender add_marca d’água() função:
     
  reader = PdfReader(wmFile)   
pageObj.merge_page(reader.pages[0])
return pageObj
  • Acima de tudo, criamos um objeto leitor de PDF de marca d'água.pdf . Para o objeto de página passado, usamos página_mesclagem() função e passe o objeto de página da primeira página do objeto leitor de PDF de marca d'água. Isso sobreporá a marca d’água sobre o objeto de página passado.


E aqui chegamos ao final deste longo tutorial sobre como trabalhar com arquivos PDF em python.
Agora você pode criar facilmente seu próprio gerenciador de PDF!
Referências:
 

  • https://automatetheboringstuff.com/chapter13/
  • https://pypi.org/project/pypdf/

Se você gosta de GeeksforGeeks e gostaria de contribuir, você também pode escrever um artigo usando write.geeksforgeeks.org ou enviar seu artigo para [email protected]. Veja seu artigo aparecendo na página principal do GeeksforGeeks e ajude outros Geeks.
Por favor, escreva comentários se encontrar algo incorreto ou se quiser compartilhar mais informações sobre o tópico discutido acima.
 

Criar questionário