소개
Aspose.PDF FOSS for C++은 C++20 코드에서 PDF 문서를 다루기 위한 새로운 오픈소스 라이브러리입니다. MIT 라이선스로 배포되며 C++ 표준 라이브러리 외에 런타임 의존성이 없습니다 — BMP, JPEG, TIFF 인코더와 페이지 래스터라이저, PDF 파서는 내부에 구현되어 있어 상업용 PDF 엔진, 외부 이미지 코덱, 제3자 암호화 라이브러리에 연결되지 않습니다.
이 라이브러리는 Aspose::Pdf::Document 클래스를 중심으로 구성되어 있으며, 파일 경로에서 PDF를 로드하고 Document.Pages()를 통해 개별 Page 객체들의 PageCollection 형태로 내용을 노출합니다. 여기서 API는 텍스트 추출, 페이지 래스터화, 문서 암호화, 주석 및 AcroForm 필드 등을 다루며—기존 PDF 파일을 읽고, 검사하고, 수정하거나, 처음부터 새로운 파일을 생성하는 데 필요한 작업들입니다.
이 릴리스는 상업용 라이선스나 제3자 의존성을 추가하지 않고 C++ 코드베이스 내에서 PDF 처리가 필요한 개발자를 위한 것입니다: 문서 파이프라인, 콘텐츠 추출 서비스, PDF‑to‑image 변환 도구, 그리고 빌드 전반에서 폼 데이터를 암호화하거나 다시 읽어야 하는 애플리케이션 등.
포함 내용
문서 로드 및 페이지 접근
기존 PDF를 여는 것은 단일 생성자 호출만으로 이루어집니다. Document는 파일을 파싱하고 Pages()를 통해 페이지들을 노출하는데, 이 메서드는 1부터 시작하는 인덱싱, Count(), 그리고 페이지 순서를 재구성하기 위한 Add()/Insert()/Delete()를 지원하는 PageCollection을 반환합니다.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";
auto page = doc.Pages()[1];
std::cout << "First page number: " << page.Number() << "\n";
}
텍스트 추출
Aspose::Pdf::Text::TextAbsorber는 Document 또는 단일 Page를 순회하면서 찾아낸 텍스트 내용을 수집합니다. Visit()을 문서나 페이지에 대해 호출한 뒤, Text()로 결과를 읽어냅니다. HasErrors()는 흡수기가 처리할 수 없는 내용을 발견했는지 여부를 보고합니다.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(doc);
std::cout << absorber.Text() << "\n";
if (absorber.HasErrors()) {
std::cerr << "Some content could not be extracted\n";
}
}
래스터 이미지로 렌더링
페이지는 BmpDevice, JpegDevice, TiffDevice 클래스를 통해 BMP, JPEG, 또는 TIFF 형식으로 렌더링됩니다. 각 디바이스는 Resolution으로 생성되며, 렌더링된 이미지를 출력 스트림에 기록하는 Process(page, output) 메서드를 제공합니다.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
Aspose::Pdf::Devices::BmpDevice bmp(Aspose::Pdf::Devices::Resolution(150));
std::ofstream out("page1.bmp", std::ios::binary);
bmp.Process(doc.Pages()[1], out);
}
암호화
Document.Encrypt()는 사용자 비밀번호, 소유자 비밀번호, 권한 값, 그리고 CryptoAlgorithm 선택을 사용하여 문서를 보호합니다. 열거형은 RC4-40 (RC4x40), RC4-128 (RC4x128), AES-128 (AESx128), 그리고 AES-256 (AESx256)을 포함합니다. Document.Decrypt()는 이 작업을 되돌리며, IsEncrypted()는 현재 문서가 암호화되어 있는지를 보고합니다.
#include <aspose/pdf/document.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
doc.Encrypt("user-password", "owner-password",
Aspose::Pdf::Permissions::PrintDocument,
Aspose::Pdf::CryptoAlgorithm::AESx256);
doc.Save("encrypted.pdf");
}
주석
각 Page는 Annotations()를 통해 AnnotationCollection을 노출합니다. TextAnnotation은 소유 문서를 기준으로 생성되고, Rectangle로 위치를 지정한 뒤 Add()를 사용해 페이지 컬렉션에 추가됩니다.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>
#include <aspose/pdf/rectangle.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
Aspose::Pdf::Annotations::TextAnnotation note(doc);
note.Rect(Aspose::Pdf::Rectangle(100.0, 700.0, 200.0, 720.0, false));
note.Contents("Reviewed - see section 2");
doc.Pages()[1].Annotations().Add(note);
doc.Save("annotated.pdf");
}
AcroForm 필드
Document.Form()은 문서의 Form을 반환하며, 이는 Fields()를 통해 기존 필드들을 std::vector<Field*> 형태로 노출합니다. 각 Field는 PartialName()과 Value()로 이름과 현재 값을 보고하고, Form.Flatten()은 모든 필드의 표시를 페이지 내용에 합쳐 인터랙티브 기능을 제거합니다.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("form.pdf");
auto& form = doc.Form();
std::cout << "Field count: " << form.Count() << "\n";
for (auto* field : form.Fields()) {
std::cout << field->PartialName() << " = " << field->Value() << "\n";
}
form.Flatten();
doc.Save("flattened.pdf");
}
빠른 시작
라이브러리를 CMake 서브디렉터리로 추가하고 aspose_pdf_foss 타깃에 링크합니다:
add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)
문서를 열고, 페이지 수를 출력하고, 텍스트를 추출한 다음, 첫 페이지를 BMP 파일로 렌더링합니다:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Pages: " << doc.Pages().Count() << "\n";
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(doc);
std::cout << absorber.Text() << "\n";
Aspose::Pdf::Devices::BmpDevice bmp(Aspose::Pdf::Devices::Resolution(150));
std::ofstream out("page1.bmp", std::ios::binary);
bmp.Process(doc.Pages()[1], out);
}
지원되는 형식
| 포맷 | 확장자 | 읽기 | 쓰기 |
|---|---|---|---|
| BMP | .bmp | — | ✓ |
| JPEG | .jpg | — | ✓ |
| TIFF | .tiff | — | ✓ |
| Text | .txt | — | ✓ |
| SVG | .svg | ✓ | — |
BMP, JPEG 및 TIFF는 각각의 장치 클래스에서 생성되는 페이지 렌더링 출력입니다. PDF에서 텍스트는 TextAbsorber를 통해 추출됩니다. SVG는 라이브러리의 SVG 로드 경로를 통해 벡터 콘텐츠로 가져옵니다.
오픈 소스 및 라이선스
Aspose.PDF FOSS for C++은 MIT 라이선스 하에 배포되며, 전체 소스는 다음에서 확인할 수 있습니다 github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp. 이 라이선스는 별도의 계약 없이 상업적 사용, 수정 및 재배포를 허용합니다.