Python을 사용하여 PDF 파일에서 텍스트, 링크 및 이미지를 추출하는 방법

Python은 매우 다재다능한 언어이므로 Python 개발자는 다양한 파일로 작업하고 처리를 위해 해당 파일에 저장된 정보를 가져와야 하는 경우가 많습니다. Python 개발자로서 접하게 될 인기 있는 파일 형식 중 하나는 PDF로 널리 알려진 휴대용 문서 형식입니다.

PDF 파일에는 텍스트, 이미지, 링크가 포함될 수 있습니다. Python 프로그램에서 데이터를 처리할 때 PDF 문서에 저장된 데이터를 추출해야 할 수도 있습니다. 튜플, 목록, 사전과 같은 데이터 구조와 달리 PDF 문서에 저장된 정보를 가져오는 것은 어려운 일처럼 보일 수 있습니다.

다행히 PDF 작업을 쉽게 하고 PDF 파일에 저장된 데이터를 추출할 수 있는 라이브러리가 많이 있습니다. 이러한 다양한 라이브러리에 대해 알아보려면 PDF 파일에서 텍스트, 링크 및 이미지를 추출하는 방법을 살펴보겠습니다. 계속하려면 다음 PDF 파일을 다운로드하여 Python 프로그램 파일과 동일한 디렉터리에 저장하세요.

Python을 사용하여 PDF 파일에서 텍스트를 추출하려면 PyPDF2 도서관. PyPDF2는 PDF 파일의 페이지를 병합, 자르기 및 변환하는 데 사용할 수 있는 무료 오픈 소스 Python 라이브러리입니다. PDF 파일에 사용자 정의 데이터, 보기 옵션 및 비밀번호를 추가할 수 있습니다. 그러나 중요한 것은 PyPDF2가 PDF 파일에서 텍스트를 검색할 수 있다는 것입니다.

PyPDF2를 사용하여 PDF 파일에서 텍스트를 추출하려면 Python용 패키지 설치 프로그램인 pip를 사용하여 설치하세요. pip를 사용하면 컴퓨터에 다양한 Python 패키지를 설치할 수 있습니다.

1. 다음을 실행하여 이미 pip가 설치되어 있는지 확인합니다.

pip --version

버전 번호를 받지 못하면 pip가 설치되지 않은 것입니다.

2. pip를 설치하려면 다음을 클릭하세요. 핍을 얻으세요 설치 스크립트를 다운로드합니다.

링크를 클릭하면 아래와 같이 pip를 설치하는 스크립트가 포함된 페이지가 열립니다.

페이지를 마우스 오른쪽 버튼으로 클릭하고 다른 이름으로 저장을 클릭하여 파일을 저장합니다. 기본적으로 파일 이름은 get-pip.py입니다.

터미널을 열고 방금 다운로드한 get-pip.py 파일이 있는 디렉터리로 이동한 후 다음 명령을 실행합니다.

sudo python3 get-pip.py

그러면 아래와 같이 pip가 설치됩니다.

3. 다음을 실행하여 pip가 성공적으로 설치되었는지 확인합니다.

pip --version

성공하면 버전 번호를 받아야 합니다.

pip가 설치되었으므로 이제 PyPDF2 작업을 시작할 수 있습니다.

1. 터미널에서 다음 명령을 실행하여 PyPDF2를 설치합니다.

pip install PyPDF2

2. Python 파일을 만들고 다음 줄을 사용하여 PyPDF2에서 PdfReader를 가져옵니다.

from PyPDF2 import PdfReader

PyPDF2 라이브러리는 PDF 파일 작업을 위한 다양한 클래스를 제공합니다. 이러한 클래스 중 하나는 PDF 파일을 열고, 내용을 읽고, PDF 파일에서 텍스트를 추출하는 데 사용할 수 있는 PdfReader입니다.

3. PDF 파일 작업을 시작하려면 먼저 파일을 열어야 합니다. 이렇게 하려면 PdfReader 클래스의 인스턴스를 만들고 작업하려는 PDF 파일을 전달합니다.

reader = PdfReader('games.pdf')

위의 줄은 PdfReader를 인스턴스화하고 지정한 PDF 파일의 내용에 액세스할 수 있도록 준비합니다. 인스턴스는 PdfReader 클래스에서 사용할 수 있는 다양한 메서드와 속성에 액세스해야 하는 reader라는 변수에 저장됩니다.

4. 모든 것이 제대로 작동하는지 확인하려면 다음 코드를 사용하여 전달한 PDF의 페이지 수를 인쇄하십시오.

print(len(reader.pages))

산출:

5

5. PDF 파일은 5페이지로 구성되어 있으므로 PDF에서 사용 가능한 각 페이지에 액세스할 수 있습니다. 그러나 계산은 Python의 인덱싱 규칙과 마찬가지로 0부터 시작합니다. 따라서 PDF 파일의 첫 번째 페이지는 페이지 번호 0이 됩니다. PDF의 첫 번째 페이지를 검색하려면 코드에 다음 줄을 추가하세요.

page1 = reader.pages[0]

위의 줄은 PDF 파일의 첫 번째 페이지를 검색하여 page1이라는 변수에 저장합니다.

6. PDF 파일의 첫 번째 페이지에서 텍스트를 추출하려면 다음 줄을 추가합니다.

textPage1 = page1.extract_text()

그러면 PDF의 첫 번째 페이지에서 텍스트가 추출되어 textPage1이라는 변수에 내용이 저장됩니다. 따라서 textPage1 변수를 통해 PDF 파일의 첫 번째 페이지에 있는 텍스트에 액세스할 수 있습니다.

7. 텍스트가 성공적으로 추출되었는지 확인하려면 textPage1 변수의 내용을 인쇄하면 됩니다. PDF 파일의 첫 번째 페이지에 있는 텍스트도 인쇄하는 전체 코드는 다음과 같습니다.

# import the PdfReader class from PyPDF2
from PyPDF2 import PdfReader

# create an instance of the PdfReader class
reader = PdfReader('games.pdf')

# get the number of pages available in the pdf file
print(len(reader.pages))

# access the first page in the pdf
page1 = reader.pages[0]

# extract the text in page 1 of the pdf file
textPage1 = page1.extract_text()

# print out the extracted text
print(textPage1)

산출:

PDF 파일에서 링크를 추출하기 위해 PDF와 같은 문서에 저장된 데이터를 추출, 분석, 변환 및 조작하기 위한 Python 라이브러리인 PyMuPDF를 사용하겠습니다. PyMuPDF를 사용하려면 Python 3.8 이상이 필요합니다. 시작하려면:

1. 터미널에서 다음 줄을 실행하여 PyMuPDF를 설치합니다:

pip install PyMuPDF

2. 다음 명령문을 사용하여 PyMuPDF를 Python 파일로 가져옵니다.

import fitz

3. 링크를 추출하려는 PDF에 액세스하려면 먼저 해당 PDF를 열어야 합니다. 열려면 다음 줄을 입력하십시오.

doc = fitz.open("games.pdf")

4. PDF 파일을 연 후 다음 줄을 사용하여 PDF의 페이지 수를 인쇄합니다.

print(doc.page_count)

산출:

5

4. PDF 파일의 페이지에서 링크를 추출하려면 링크를 추출하려는 페이지를 로드해야 합니다. 페이지를 로드하려면 다음 줄을 입력하세요. 여기서 로드하려는 페이지 번호를 load_page()라는 함수에 전달하세요.

page = doc.load_page(0)

첫 번째 페이지에서 링크를 추출하려면 0(영)을 전달합니다. 페이지 수 계산은 배열 및 사전과 같은 데이터 구조에서와 마찬가지로 0부터 시작됩니다.

5. 다음 줄을 사용하여 페이지에서 링크를 추출합니다.

links = page.get_links()

지정한 페이지(이 경우 1페이지)의 모든 링크가 추출되어 link라는 변수에 저장됩니다.

6. 링크 변수의 내용을 보려면 다음과 같이 인쇄하십시오.

print(links)

산출:

인쇄된 출력에서 ​​변수 링크에 키-값 쌍이 있는 사전 목록이 포함되어 있음을 확인하세요. 페이지의 각 링크는 사전으로 표시되며 실제 링크는 “uri” 키 아래에 저장됩니다.

7. 변수 이름 링크 아래에 저장된 개체 목록에서 링크를 가져오려면 for in 문을 사용하여 목록을 반복하고 키 uri 아래에 저장된 특정 링크를 인쇄합니다. 이를 수행하는 전체 코드는 다음과 같습니다.

import fitz

# Open the PDF file
doc = fitz.open("games.pdf")

# Print out the number of pages
print(doc.page_count)

# load the first page from the PDF
page = doc.load_page(0)

# extract all links from the page and store it under - links
links = page.get_links()

# print the links object
#print(links) 

# print the actual links stored under the key "uri"
for obj in links:
  print(obj["uri"])

산출:

5
https://www.statista.com/statistics/1292243/software-developers-average-age-when-first-coding/
https://sparkian.com/
https://www.codemonkey.com/

8. 코드의 재사용성을 높이기 위해 PDF의 모든 링크를 추출하는 함수와 PDF에서 발견된 모든 링크를 인쇄하는 함수를 정의하여 코드를 리팩터링할 수 있습니다. 이렇게 하면 모든 PDF에서 함수를 호출할 수 있으며 PDF의 모든 링크를 다시 얻을 수 있습니다. 이를 수행하는 코드는 아래와 같습니다.

import fitz

# Extract all the links in a PDF document
def extract_link(path_to_pdf):
  links = []
  doc = fitz.open(path_to_pdf)

  for page_num in range(doc.page_count):
    page = doc.load_page(page_num)
    page_links = page.get_links()
    links.extend(page_links)
  return links

# print out all the links returned from the PDF document
def print_all_links(links):
  for link in links:
    print(link["uri"])

# Call the function to extract all the links in a pdf
# all the return links are stored under all_links
all_links = extract_link("games.pdf")

# call the function to print all links in the PDF
print_all_links(all_links)

산출:

https://www.statista.com/statistics/1292243/software-developers-average-age-when-first-coding/
https://sparkian.com/
https://www.codemonkey.com/
https://scratch.mit.edu/
https://www.tynker.com/
https://codecombat.com/
https://lightbot.com/
https://sparkian.com

위 코드에서 extract_link() 함수는 PDF 파일을 수신하고 PDF의 모든 페이지를 반복하고 모든 링크를 추출하여 반환합니다. 이 함수의 결과는 all_links라는 변수에 저장됩니다.

print_all_links() 함수는 extract_link()의 결과를 가져와 목록을 반복하고 extract_link() 함수에 전달한 PDF에서 발견된 모든 실제 링크를 인쇄합니다.

PDF에서 이미지를 추출하기 위해 여전히 PyMuPDF를 사용할 것입니다. PDF 파일에서 이미지를 추출하려면:

1. PyMuPDF, io 및 PIL을 가져옵니다. PIL(Python Imaging Library)은 다양한 기능 중에서 이미지를 쉽게 생성하고 저장할 수 있는 도구를 제공합니다. io는 바이너리 데이터를 쉽고 효율적으로 처리하기 위한 클래스를 제공합니다.

import fitz
from io import BytesIO
from PIL import Image

2. 이미지를 추출하려는 PDF 파일을 엽니다.

doc = fitz.open("games.pdf")

3. 이미지를 추출하려는 페이지를 로드합니다.

page = doc.load_page(0)

4. PyMuPdf는 일반적으로 정수인 상호 참조 번호(xref)를 사용하여 PDF 파일의 이미지를 식별합니다. PDF 파일의 모든 이미지에는 고유한 외부 참조가 있습니다. 따라서 PDF에서 이미지를 추출하려면 먼저 해당 이미지를 식별하는 외부 참조 번호를 가져와야 합니다. 페이지에 있는 이미지의 외부 참조 번호를 얻으려면 다음과 같이 get_images() 함수를 사용합니다.

image_xref = page.get_images()
print(image_xref)

산출:

[(7, 0, 699, 407, 8, 'DeviceRGB', '', 'X7', 'FlateDecode')]

get_images()는 이미지에 대한 정보가 포함된 튜플 목록을 반환합니다. 첫 번째 페이지에는 이미지가 하나만 있으므로 튜플도 하나만 있습니다. 튜플의 첫 번째 요소는 페이지에 있는 이미지의 외부 참조를 나타냅니다. 따라서 첫 번째 페이지 이미지의 외부 참조는 7입니다.

5. 튜플 목록에서 이미지의 외부 참조 값을 추출하려면 아래 코드를 사용합니다.

# get xref value of the image
xref_value = image_xref[0][0]
print(xref_value)

산출:

[(7, 0, 699, 407, 8, 'DeviceRGB', '', 'X7', 'FlateDecode')]
7

6. 이제 PDF에서 이미지를 식별하는 외부 참조가 있으므로 다음과 같이 extract_image() 함수를 사용하여 이미지를 추출할 수 있습니다.

img_dictionary = doc.extract_image(xref_value)

그러나 이 함수는 실제 이미지를 반환하지 않습니다. 대신, 무엇보다도 이미지의 이진 이미지 데이터와 이미지에 대한 메타데이터가 포함된 사전을 반환합니다.

7. extract_image() 함수가 반환한 사전에서 추출된 이미지의 파일 확장자를 확인합니다. 파일 확장자는 “ext” 키 아래에 저장됩니다:

# get file extenstion
img_extension = img_dictionary["ext"]
print(img_extension)

산출:

png

8. img_dictionary에 저장된 사전에서 이미지 바이너리를 추출합니다. 이미지 바이너리는 “image” 키 아래에 저장됩니다.

# get the actual image binary data
img_binary = img_dictionary["image"]

9. BytesIO 객체를 생성하고 이미지를 나타내는 이진 이미지 데이터로 초기화합니다. 그러면 이미지를 저장할 수 있도록 PIL과 같은 Python 라이브러리에서 처리할 수 있는 파일 형식의 개체가 생성됩니다.

# create a BytesIO object to work with the image bytes
image_io = BytesIO(img_binary)

10. PIL 라이브러리를 사용하여 image_io라는 BytesIO 개체에 저장된 이미지 데이터를 열고 구문 분석합니다. PIL 라이브러리가 작업하려는 이미지의 이미지 형식(이 경우 PNG)을 결정할 수 있으므로 이는 중요합니다. 이미지 형식을 감지한 후 PIL은 save() 메서드와 같은 PIL 함수 및 메서드로 조작할 수 있는 이미지 객체를 생성하여 이미지를 로컬 저장소에 저장합니다.

# open the image using Pillow
image = Image.open(image_io)

11. 이미지를 저장할 경로를 지정하세요.

output_path = "image_1.png"

위 경로에는 확장자를 포함한 파일 이름만 포함되어 있으므로 추출된 이미지는 이 프로그램이 포함된 Python 파일과 동일한 디렉터리에 저장됩니다. 이미지는 image_1.png로 저장됩니다. PNG 확장자는 이미지의 원래 확장자와 일치하는 데 중요합니다.

12. 이미지를 저장하고 ByteIO 개체를 닫습니다.

# save the image
image.save(output_path)

# Close the BytesIO object 
image_io.close()

PDF 파일에서 이미지를 추출하는 전체 코드는 다음과 같습니다.

import fitz
from io import BytesIO
from PIL import Image

doc = fitz.open("games.pdf")
page = doc.load_page(0)

# get a cross reference(xref) to the image
image_xref = page.get_images()

# get the actual xref value of the image
xref_value = image_xref[0][0]

# extract the image
img_dictionary = doc.extract_image(xref_value)

# get file extenstion
img_extension = img_dictionary["ext"]

# get the actual image binary data
img_binary = img_dictionary["image"]

# create a BytesIO object to work with the image bytes
image_io = BytesIO(img_binary)

# open the image using PIL library 
image = Image.open(image_io)

#specify the path where you want to save the image
output_path = "image_1.png"

# save the image
image.save(output_path)

# Close the BytesIO object 
image_io.close()

코드를 실행하고 Python 파일이 포함된 폴더로 이동합니다. 아래와 같이 image_1.png라는 추출된 이미지가 표시됩니다.

결론

PDF에서 링크, 이미지 및 텍스트를 추출하는 방법을 더 많이 연습하려면 링크 예제에 표시된 대로 예제의 코드를 리팩터링하여 재사용이 가능하도록 만드세요. 이렇게 하면 PDF 파일만 전달하면 Python 프로그램이 전체 PDF의 모든 링크, 이미지 또는 텍스트를 추출합니다. 즐거운 코딩하세요!

모든 비즈니스 요구에 맞는 최고의 PDF API를 탐색할 수도 있습니다.