C++에서 PDF 문서 작업하는 방법

C++에서 PDF 문서 작업하는 방법

Aspose.PDF FOSS for C++는 MIT 라이선스를 갖고 의존성이 없는 C++20 라이브러리이며 CMake로 빌드 및 링크됩니다 — 추가할 패키지 매니저 가져오기가 없습니다. 이 가이드는 핵심 Document 중심 워크플로우를 안내합니다: 기존 PDF를 열고, 페이지와 메타데이터를 검사하며, 텍스트를 추출하고, 페이지를 래스터 이미지로 렌더링합니다.

단계별 가이드

1단계: 패키지 설치

저장소를 클론하고 서브디렉터리로 CMake 프로젝트에 추가합니다:

git clone https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.git
add_subdirectory(Aspose.PDF-FOSS-for-Cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

또는 독립형으로 구성하고 빌드합니다:

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build

헤더에 대해 최소 프로그램을 컴파일하여 툴체인이 해결되는지 확인합니다:

#include <aspose/pdf/document.hpp>
#include <iostream>

int main() {
    Aspose::Pdf::Document doc;
    std::cout << "Linked OK - pages: " << doc.Pages().Count() << "\n";
}

새로 구축된 빈 Document에 대해 pages: 0을 출력하는 성공적인 빌드는 라이브러리가 올바르게 연결되었음을 확인합니다.


2단계: 필요한 클래스 가져오기

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/document_info.hpp>
#include <aspose/pdf/page.hpp>
#include <aspose/pdf/page_collection.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
#include <iostream>

3단계: PDF 문서를 열고 페이지 수를 셉니다

파일 경로에서 Document을 구성하여 기존 PDF를 엽니다. Document::Pages()은 PageCollection를 반환하고, Count()은 해당 PDF가 보유한 페이지 수를 보고합니다:

Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";

4단계: 문서 메타데이터 읽기

Document::Info()은 표준 /Info 사전 항목에 대한 타입이 지정된 읽기/쓰기 접근자를 가진 DocumentInfo 객체를 반환합니다:

auto& info = doc.Info();
std::cout << "Title: "    << info.Title()    << "\n";
std::cout << "Author: "   << info.Author()   << "\n";
std::cout << "Producer: " << info.Producer() << "\n";

5단계: 페이지에서 텍스트 추출

Aspose::Pdf::Text::TextAbsorber은 Document 또는 단일 Page를 순회하면서 발견한 텍스트를 누적하고; Text()은 이후 결과를 반환합니다. PageCollection는 1부터 시작하므로 Pages()[1]가 첫 페이지입니다:

auto page = doc.Pages()[1];

Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(page);
std::cout << absorber.Text() << "\n";

Visit()는 단일 페이지 대신 모든 페이지의 텍스트를 함께 연결하고 싶을 때 전체 Document를 직접 (absorber.Visit(doc)) 받아들입니다.


Step 6: 페이지를 래스터 이미지로 렌더링

BmpDevice는 Page를 압축되지 않은 BMP 이미지로 렌더링합니다. 생성자는 출력 DPI를 제어하는 Resolution를 받아들이며, Process()는 렌더링된 바이트를 任意의 std::ostream에 씁니다:

Aspose::Pdf::Devices::BmpDevice device(Aspose::Pdf::Devices::Resolution(150));

std::ofstream imageOut("page1.bmp", std::ios::binary);
device.Process(page, imageOut);

Step 7: 메타데이터 업데이트 및 문서 저장

DocumentInfo의 세터는 소유 Document에서 Save()이 실행될 때 다음에 플러시되는 변경을 단계화합니다:

doc.Info().Title("Processed by Aspose.PDF FOSS for C++");
doc.Save("output.pdf");

일반적인 문제 및 해결책

Accessing Pages()[0] throws std::out_of_range

PageCollection은(는) 1부터 시작하는 인덱스로, 정규 Aspose.PDF 의미와 일치합니다 — 첫 페이지는 Pages()[1]입니다. 1보다 작거나 Count()보다 큰 인덱스를 사용하면 오류가 발생합니다.

TextAbsorber::Text() 빈 문자열을 반환합니다

Text()은(는) 가장 최근 Visit() 호출로 누적된 내용을 반환합니다. Text()을(를) 읽기 전에 Visit()가 실제로 호출되었는지 확인하고, 방문한 페이지나 문서에 스캔된 이미지만이 아니라 추출 가능한 텍스트가 포함되어 있는지 확인하십시오.

렌더링된 BMP 파일이 예상보다 작거나 빈 것처럼 보입니다

낮은 Resolution 값은 작은 래스터 이미지를 생성합니다. Resolution에 전달되는 DPI를 높이세요 — 예를 들어, 인쇄 품질 출력을 위해 Resolution(300)와 같이 — 그리고 Process()에 전달된 페이지 인덱스가 의도한 것인지 확인하십시오.

DocumentInfo 필드가 빈 문자열로 읽혀집니다

모든 PDF 제작자가 표준 /Info 항목을 기록하는 것은 아닙니다. 메타데이터 추출이 실패했다고 가정하기 전에 Producer()와 Creator()에 빈 값이 있는지 확인하십시오 — 키가 없을 경우 정의된 결과는 빈 문자열입니다.

다음과 함께 수행된 변경 Info().Title(...) 저장된 파일에 나타나지 않습니다

DocumentInfo 변이(mutations)는 메모리에서 단계적으로 저장되며 동일한 Document 인스턴스에서 Save()이(가) 다음에 실행될 때만 영구화됩니다. 메타데이터 편집이 Save() 이전에 이루어지도록 하고, 이후가 아니라는 점을 확인하십시오.

자주 묻는 질문

Aspose.PDF FOSS for C++에서 페이지 인덱싱은 0부터 시작합니까, 아니면 1부터 시작합니까?

1부터 시작합니다. doc.Pages()[1]은(는) 항상 첫 번째 페이지입니다.

TextAbsorber이(가) 전체 문서가 아니라 단일 페이지에서 텍스트를 추출할 수 있습니까?

예. Visit()은(는) Document을(를) 받아들일 수 있도록 오버로드되어 있습니다 — 이는 모든 페이지의 텍스트를 추출하고 — 또는 단일 Page을(를) 받아 해당 페이지의 텍스트만 추출합니다.

문서에서 데이터를 읽기만 할 경우 Save()을(를) 호출해야 합니까?

아니요. Save()은(는) 파일에 다시 기록해야 하는 변경(예: DocumentInfo 필드 편집)이 있을 때만 필요합니다. 페이지 수를 읽거나 텍스트를 추출하거나 페이지를 렌더링하는 것은 문서를 수정하지 않습니다.

렌더링된 페이지의 해상도를 어떻게 제어하나요?

디바이스 생성자에 Resolution 값을 전달하십시오 — 예를 들어, 150 DPI에 대해 Resolution(150)을(를) 사용합니다. 높은 값일수록 더 크고 고충실도의 래스터 이미지가 생성됩니다.

BmpDevice는 어떤 포맷을 생성합니까?

압축되지 않은 BMP 이미지가 Process()에 전달된 std::ostream에 직접 기록됩니다.

참조

 한국어