Вступ
Aspose.PDF FOSS для C++ — це open-source бібліотека C++20 для роботи з PDF-документами. Поверхня API охоплює управління документами та сторінками, видобування тексту, растрове рендеринг, шифрування, анотації та інтерактивні поля AcroForm — операції, які найчастіше потрібні, коли C++-застосунок має створювати, досліджувати чи трансформувати PDF-файли без залежності від зовнішнього PDF-двигуна або комерційного SDK.
Бібліотека лінкується лише зі стандартною бібліотекою C++. Внутрішні компоненти, такі як растрові енкодери BMP, JPEG та TIFF та растеризатор сторінок, реалізовані з нуля в межах проєкту, тому немає залежності від системного PDF-рендерера, комерційного PDF-компонента чи будь-якого стороннього кодека зображень. Це зберігає «вагу» залежностей на нулі, окрім компілятора, сумісного з C++20, та стандартної бібліотеки.
Aspose.PDF FOSS для C++ випущений під ліцензією MIT. У цьому дописі розглядаються основні області функціональності, які надає клас Document та його допоміжні типи, після чого йде приклад швидкого старту та поточна підтверджена підтримка форматів.
Ключові можливості
Управління документами та сторінками
Клас Document є точкою входу для відкриття, аналізу та збереження PDF-файлів. Сторінки доступні через Document.Pages(), який повертає PageCollection, що підтримує Count(), Add(), Insert(pageNumber) та Delete(pageNumber). Метадані на рівні документа читаються та оновлюються через Document.Info() (екземпляр DocumentInfo) або встановлюються безпосередньо за допомогою Document.SetTitle().
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/page_collection.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
std::cout << "Page count: " << doc.Pages().Count() << "\n";
// Insert a blank page after page 1, then drop the last page
doc.Pages().Insert(2);
doc.Pages().Delete(doc.Pages().Count());
doc.SetTitle("Generated Report");
doc.Save("output.pdf");
}
Document.Optimize() і Document.OptimizeResources() зменшують розмір вихідного файлу, консолідуючи та видаляючи невикористані ресурси перед збереженням.
Витягування тексту
Aspose::Pdf::Text::TextAbsorber витягує простий текстовий вміст усього документа або окремої сторінки. Visit() обходить ціль і Text() повертає накопичений рядок. TextFragmentAbsorber працює з більш тонкою гранулюрністю, відкриваючи індивідуальні текстові ділянки через TextFragmentCollection.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/text_fragment_absorber.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
// Extract all text from the document
Aspose::Pdf::Text::TextAbsorber absorber;
absorber.Visit(doc);
std::cout << absorber.Text() << "\n";
// Extract text fragments from page 1
Aspose::Pdf::Text::TextFragmentAbsorber fragmentAbsorber;
fragmentAbsorber.Visit(doc.Pages()[1]);
auto fragments = fragmentAbsorber.TextFragments();
std::cout << "Fragments on page 1: " << fragments.Count() << "\n";
}
Візуалізація у растрові зображення
Сторінки рендеряться у растрові формати через клас пристроїв для кожного формату — PngDevice, JpegDevice, BmpDevice та TiffDevice — кожен реалізує Process(page, output). Роздільна здатність виводу контролюється класом Resolution.
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/png_device.hpp>
#include <aspose/pdf/bmp_device.hpp>
#include <aspose/pdf/resolution.hpp>
#include <fstream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto page = doc.Pages()[1];
Aspose::Pdf::Devices::PngDevice png(Aspose::Pdf::Devices::Resolution(150));
std::ofstream pngOut("page1.png", std::ios::binary);
png.Process(page, pngOut);
Aspose::Pdf::Devices::BmpDevice bmp(Aspose::Pdf::Devices::Resolution(150));
std::ofstream bmpOut("page1.bmp", std::ios::binary);
bmp.Process(page, bmpOut);
}
JpegDevice слідує тому ж шаблону Process(page, output) для виводу JPEG. TiffDevice додатково підтримує багатосторінковий вивід в одному виклику через Process(document, fromPage, toPage, output) і надає RenderingOptions() для керування тим, як поля форми рендеряться у растровий вихід.
Шифрування та дозволи доступу
Document.Encrypt() захищає документ за допомогою пароля користувача та власника, вибираючи шифр через перелік CryptoAlgorithm: RC4x40, RC4x128, AESx128 або AESx256. Надані дозволи описуються типом Permissions, значення прапорців якого включають PrintDocument, ModifyContent, ExtractContent, ModifyTextAnnotations, FillForm, ExtractContentWithDisabilities, AssembleDocument та PrintingQuality.
#include <aspose/pdf/document.hpp>
int main() {
Aspose::Pdf::Document doc("input.pdf");
doc.Encrypt("user-password", "owner-password",
Aspose::Pdf::Permissions(),
Aspose::Pdf::CryptoAlgorithm::AESx256);
doc.Save("encrypted.pdf");
}
Вже відкритий зашифрований документ розшифровується на місці за допомогою Document.Decrypt(). Document.IsEncrypted() повідомляє, чи завантажений документ наразі містить словник шифрування.
Анотації
Анотації на рівні сторінки — текстові нотатки, форми та розмітка — доступні через Page.Annotations(), який повертає AnnotationCollection. Окремі записи розкривають спільні властивості, такі як Contents(), Rect(), Color(), Border() та AnnotationType(), і їх можна видалити зі сторінки або сплющити в статичний вміст.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& annotations = doc.Pages()[1].Annotations();
std::cout << "Annotation count: " << annotations.Count() << "\n";
for (int i = 0; i < static_cast<int>(annotations.Count()); ++i) {
std::cout << "Contents: " << annotations[i].Contents() << "\n";
}
// Remove the first annotation on the page
if (annotations.Count() > 0) {
annotations.Delete(annotations[0]);
}
doc.Save("output.pdf");
}
Будь-який окремий Annotation також можна безпосередньо перетворити у статичний вміст сторінки за допомогою його власного методу Flatten(), незалежно від наведеної нижче процедури сплющування форм.
Інтерактивні форми
AcroForm поля у документі керуються через Document.Form(), який повертає екземпляр Form, що підтримує Count(), HasField(fieldName), Delete(fieldName) та Flatten(). Нові поля додаються за допомогою Form.Add(field, pageNumber), де field — це конкретний підтип Field, такий як TextBoxField, CheckboxField, ChoiceField або ButtonField.
#include <aspose/pdf/document.hpp>
#include <iostream>
int main() {
Aspose::Pdf::Document doc("input.pdf");
auto& form = doc.Form();
std::cout << "Form fields: " << form.Count() << "\n";
if (form.HasField("Signature1")) {
form.Delete("Signature1");
}
// Convert every remaining field into static page content
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)
Відкрийте документ, витягніть його текст і відобразьте першу сторінку у PNG:
#include <aspose/pdf/document.hpp>
#include <aspose/pdf/text_absorber.hpp>
#include <aspose/pdf/png_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::PngDevice png(Aspose::Pdf::Devices::Resolution(150));
std::ofstream out("page1.png", std::ios::binary);
png.Process(doc.Pages()[1], out);
}
Підтримувані формати
| Формат | Розширення | Читати | Запис |
|---|---|---|---|
| BMP | bmp | — | ✓ |
| JPEG | jpeg | — | ✓ |
| TIFF | tiff | — | ✓ |
| Text | txt | — | ✓ |
| SVG | svg | ✓ | — |
Відкритий код та ліцензування
Aspose.PDF FOSS для C++ випускається під ліцензією MIT, що дозволяє комерційне використання, модифікацію та розповсюдження без роялті. Джерельний код доступний за адресою github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp.
Комерційне використання дозволяється відповідно до умов ліцензії MIT. Якщо вашому проєкту потрібна підтримка корпоративного рівня, розширене покриття форматів або хмарна інтеграція, Aspose.PDF — Enterprise Product Family є окремою комерційною пропозицією.