6

Im new on Python. I am using this code to extract text. Is it possible extract all pages and have an output in a file?

import PyPDF2
pdf_file = open('sample.pdf','rb')
read_pdf = PyPDF2.PdfFileReader(pdf_file)
number_of_pages = read_pdf.getNumPages()
page = read_pdf.getPage(10)
page_content = page.extractText()
print (page_content)
Raquel Dourado
  • 75
  • 1
  • 1
  • 7
  • I think you can refer to this link http://stackoverflow.com/questions/17003185/extracting-entire-pdf-data-with-python-pdfminer/39736947#39736947 except pypdf2 – mikewolfli Apr 10 '17 at 03:46

3 Answers3

10

Use a loop to extract each page's text and write each page's text to a single file.

import PyPDF2
with open('sample.pdf','rb') as pdf_file, open('sample.txt', 'w') as text_file:
    read_pdf = PyPDF2.PdfFileReader(pdf_file)
    number_of_pages = read_pdf.getNumPages()
    for page_number in range(number_of_pages):   # use xrange in Py2
        page = read_pdf.getPage(page_number)
        page_content = page.extractText()
        text_file.write(page_content)
kindall
  • 178,883
  • 35
  • 278
  • 309
  • perfect! it worked! But... is it possible to read this kind of pdf? https://www.cotemar.com.br/biblioteca/administracao/teoria-geral-da-administracao.pdf – Raquel Dourado Apr 10 '17 at 04:59
  • It appears that that PDF is a scanned book. Even if it has been OCR'd, I have no idea whether PyPDF can deal with it. – kindall Apr 10 '17 at 05:14
0

I used following code to convert multiple pdf files into txt

p

df_dir = "D:/search/pdf"
txt_dir = "D:/pdf_to_text"


corpus = (f for f in os.listdir(pdf_dir) if not f.startswith('.') and isfile(join(pdf_dir, f)))
pdfWriter = PyPDF2.PdfFileWriter()


for filename in corpus:

    pdf = open(join(pdf_dir, filename),'rb')
    pdfReader = PyPDF2.PdfFileReader(pdf)


    for page in range(1, pdfReader.numPages):
        pageObj = pdfReader.getPage(page)
        pdfWriter.addPage(pageObj)

        text = pageObj.extractText()


        page_name = "{}-page{}.txt".format(filename[:4], page + 1)

        with open(join(txt_dir, page_name), mode="w", encoding='UTF-8') as o:
            o.write(text)

This code works properly, but for each file I have multiple pages , when I run above code it gives me data as file1-page1.txt, file1-page2.txt, file1-page3.txt. but I want file.txt contains information for all pages . How I can do it.

halfelf
  • 9,737
  • 13
  • 54
  • 63
harsh
  • 23
  • 6
0
    def getPptContent(path, text):
        pdfWriter = PyPDF2.PdfFileWriter()
        pdf = open(join(pdf_dir, filename),'rb')
        pdfReader = PyPDF2.PdfFileReader(pdf)
        for page in range(1, pdfReader.numPages):
        pageObj = pdfReader.getPage(page)
        pdfWriter.addPage(pageObj)
        text = pageObj.extractText()
  return text

  pdf_dir = "pdf_directory name"
  corpus = [str(f) for f in os.listdir(pdf_dir) if not f.startswith('.') and 
            isfile(join(pdf_dir, f))]

 for filename in corpus:
   Path = pdf_dir + "/" +filename
   print(Path)
   file_content = getPptContent(Path)
   f = open(pdf_dir + "/output/" + filename.split(".")[0]  +".txt" ,"w+", 
       encoding="utf-8")
   f.write(str(file_content))
   f.close()

Above code works for me.

harsh
  • 23
  • 6