[python] ReportLab 파일 포맷 변환

ReportLab은 파이썬에서 PDF 파일을 생성하기 위한 강력한 라이브러리입니다. 하지만 때로는 ReportLab으로 생성된 PDF 파일을 다른 파일 포맷으로 변환해야 할 수도 있습니다. 이 글에서는 ReportLab 파일을 다른 파일 포맷으로 변환하는 방법을 알아보겠습니다.

1. PDF에서 이미지로 변환하기

ReportLab으로 생성된 PDF 파일을 이미지 파일로 변환하는 방법은 여러 가지가 있습니다. 가장 간단한 방법은 Python의 Pillow 라이브러리를 사용하여 PDF를 이미지로 변환하는 것입니다.

from PIL import Image
import fitz

pdf_file = "input.pdf"
output_file = "output.jpg"

doc = fitz.open(pdf_file)
page = doc.loadPage(0)
pix = page.getPixmap()
img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)

img.save(output_file, "JPEG")

위의 예제 코드는 먼저 Pillow와 fitz 라이브러리를 임포트합니다. PDF 파일을 열고 첫 번째 페이지를 로드한 후에 해당 페이지의 픽셀 맵을 가져옵니다. 마지막으로 Pillow의 Image.frombytes 함수를 사용하여 픽셀 맵을 이미지로 변환하고 JPEG 파일로 저장합니다. output_file 변수에 원하는 출력 파일 이름을 지정하면 됩니다.

2. PDF에서 텍스트 추출하기

때로는 ReportLab으로 생성된 PDF 파일의 텍스트를 추출하여 다른 형식으로 사용해야 할 수도 있습니다. 이를 위해서는 pytesseract와 같은 OCR(광학 문자 인식) 엔진을 사용하여 PDF에서 텍스트를 추출해야 합니다.

import fitz
import pytesseract

pdf_file = "input.pdf"

doc = fitz.open(pdf_file)

output_text = ""
for page in doc:
    pix = page.get_pixmap()
    img = Image.frombytes("RGB", [pix.width, pix.height], pix.samples)
    text = pytesseract.image_to_string(img)
    output_text += text

print(output_text)

위의 예제 코드는 먼저 pytesseract와 fitz 라이브러리를 임포트합니다. PDF 파일을 열고 각 페이지의 픽셀 맵을 가져온 후, 해당 픽셀 맵을 이미지로 변환하여 pytesseract로 인식합니다. 이렇게 추출된 텍스트는 output_text 변수에 계속 추가됩니다. 추출된 텍스트를 원하는 방식으로 사용하면 됩니다.

3. PDF에서 CSV로 변환하기

PDF 파일에 표 형식의 데이터가 포함되어 있을 경우, ReportLab으로 생성된 PDF를 CSV 파일로 변환하여 데이터를 활용할 수 있습니다. 이를 위해서는 tabula-py 라이브러리를 사용합니다. 다음은 예시 코드입니다.

import tabula

pdf_file = "input.pdf"
output_file = "output.csv"

tabula.convert_into(pdf_file, output_file, output_format="csv", pages="all")

위의 코드는 tabula.convert_into 함수를 사용하여 PDF를 CSV로 변환합니다. output_format 매개변수에 “csv”를 지정하여 출력 포맷을 CSV로 설정하고, pages 매개변수에 “all”을 지정하여 모든 페이지를 변환합니다. 원하는 출력 파일 이름은 output_file 변수에 지정하면 됩니다.

마치며

위에서 언급한 방법들은 ReportLab으로 생성된 PDF 파일을 다른 파일 포맷으로 변환할 때 유용하게 사용할 수 있는 예시입니다. 하지만 PDF 파일의 구조나 데이터 형식에 따라 변환 과정이 달라질 수 있으므로, 필요에 따라 코드를 수정 및 조정해야 할 수도 있습니다. 자세한 내용은 각 라이브러리의 공식 문서를 참조하시기 바랍니다.

참고 문서: