많은 PDF 파일이 길고, 때로는 Document Parse API의 최대 페이지 한도인 100페이지를 초과하기도 해요.
이러한 긴 문서를 처리하거나 더 빠른 응답으로 손쉬운 디버깅을 위해, 긴 PDF를 짧은 PDF들로 분할할 수 있어요.
PDF 파일paper.pdf가 있다고 가정하고,
아래 코드를 실행하여 PDF를 짧은 PDF들로 분할하고 별도의 파일로 저장해주세요.
위의 예시 PDF 파일을 저장하고 paper.pdf라고 이름 붙였다고 가정해요.
중간 파일을 저장하지 않고 하나의 스크립트에서 분할, 전송, 결과 병합을 모두 처리하고 싶다면, 청크 분할을 활용한 동기 API를 참고해주세요.
"""Requirements: `pip install pymupdf` to import fitz"""import osimport fitzdef split_pdf(input_file, batch_size): # input_pdf 열기 input_pdf = fitz.open(input_file) num_pages = len(input_pdf) print(f"Total number of pages: {num_pages}") # input_pdf 분할 for start_page in range(0, num_pages, batch_size): end_page = min(start_page + batch_size, num_pages) - 1 # output_pdf를 파일로 저장 input_file_basename = os.path.splitext(input_file)[0] output_file = f"{input_file_basename}_{start_page}_{end_page}.pdf" print(output_file) with fitz.open() as output_pdf: output_pdf.insert_pdf(input_pdf, from_page=start_page, to_page=end_page) output_pdf.save(output_file) # input_pdf 닫기 input_pdf.close()# 입력 파라미터input_file = "paper.pdf" # 본인 파일로 교체하세요batch_size = 10 # 최대 사용 가능 값은 100split_pdf(input_file, batch_size)
터미널에서 결과 파일을 다음과 같이 확인할 수 있어요.
$ ls paper*paper.pdf paper_0_9.pdf paper_10_12.pdf
Document Parse는 사용자가 이미지로 추출하고자 하는 레이아웃 요소에 대해 base64 인코딩을 제공해요. 모든 figure를 추출하고 이미지 파일로 저장하는 방법을 살펴봐요. 요청 본문에 {'base64_encoding': '["figure"]'}를 추가하면, API가 모든 figure 요소에 대해 base64로 인코딩된 문자열을 반환해요. 다음 코드는 응답을 파싱하여 첫 번째 figure를 이미지 파일로 저장해요.
"""Requirements: `pip install requests`"""from glob import globimport jsonimport osimport requestsAPI_KEY = "UPSTAGE_API_KEY"def call_document_parse(input_file, output_file): # 요청 전송 response = requests.post( "https://api.upstage.ai/v1/document-digitization", headers={"Authorization": f"Bearer {API_KEY}"}, data={"base64_encoding": "['figure']", "model": "document-parse"}, # figure 카테고리의 잘라낸 이미지를 base64로 인코딩 files={"document": open(input_file, "rb")}) # 응답 저장 if response.status_code == 200: with open(output_file, "w") as f: json.dump(response.json(), f, ensure_ascii=False) else: raise ValueError(f"Unexpected status code {response.status_code}.")# input_file과 관련된 모든 짧은 PDF 찾기input_file = "paper.pdf"short_input_files = glob(os.path.splitext(input_file)[0] + "_*.pdf")# 모든 짧은 PDF에 대해 요청을 전송하고 응답 저장for short_input_file in short_input_files: print(short_input_file) short_output_file = os.path.splitext(short_input_file)[0] + ".json" call_document_parse(short_input_file, short_output_file)
import jsonimport base64# 입력 파라미터json_file = "paper_0_9.json"output_file = "paper_cropped_figure.png"# JSON 파일을 로드해 첫 번째 figure의 바운딩 박스를 가져옴with open(json_file, "r") as f: data = json.load(f) # 첫 번째 figure의 바운딩 박스를 가져와 이미지를 잘라냄 for element in data["elements"]: if element["category"] == "figure": with open (output_file, 'wb') as fh: fh.write(base64.decodebytes(str.encode(element["base64_encoding"]))) break