Jak pracovat s anotacemi PDF v C++

Jak pracovat s anotacemi PDF v C++

Aspose.PDF FOSS for C++ představuje každou PDF anotaci jako podtřídu společné základní třídy Annotation a poskytuje anotace na stránce prostřednictvím AnnotationCollection vráceného Page::Annotations(). Tento průvodce přidá anotaci s prostým textovým poznámkou a stylovanou anotaci na stránku pomocí TextAnnotation, uloží dokument, poté jej znovu otevře, aby načetl anotace zpět a odstranil jednu. Knihovna je integrována do projektu CMake jako závislost podadresáře — neexistuje krok instalace z registru balíčků.

Průvodce krok za krokem

Krok 1: Nainstalujte balíček

Přidejte knihovnu jako podadresář CMake a propojte cíl statické knihovny:

add_subdirectory(aspose.pdf-foss-for-cpp)
target_link_libraries(your_app PRIVATE aspose_pdf_foss)

Ověřte, že toolchain a krok linkování se vyřeší správně s minimálním programem:

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

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

Úspěšná kompilace, která vypíše pages: 0, potvrzuje, že je knihovna propojena.


Krok 2: Naimportujte požadované třídy

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/page_collection.hpp>
#include <aspose/pdf/rectangle.hpp>
#include <aspose/pdf/color.hpp>
#include <aspose/pdf/annotations/annotation.hpp>
#include <aspose/pdf/annotations/annotation_collection.hpp>
#include <aspose/pdf/annotations/annotation_type.hpp>
#include <aspose/pdf/annotations/annotation_flags.hpp>
#include <aspose/pdf/annotations/border.hpp>
#include <aspose/pdf/annotations/border_style.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>

using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Annotations;

Krok 3: Vytvořte dokument a přidejte stránku

Vytvořte nový dokument a přidejte k němu stránku. PageCollection::Add() vrací nově přidaný Page:

Document doc;
Page page = doc.Pages().Add();

Krok 4: Přidejte textovou anotaci na stránku

TextAnnotation se vykresluje jako poznámka ve stylu lepicí štítky. Vytvořte ji z vlastní Document, nastavte její pozici pomocí Rect() a její zprávu pomocí Contents(), pak ji přidejte do AnnotationCollection stránky:

TextAnnotation note{doc};
note.Rect(Rectangle(100.0, 700.0, 200.0, 720.0, false));
note.Contents("Reviewed and approved.");

page.Annotations().Add(note);

Krok 5: Stylizujte druhou anotaci pomocí barvy, ohraničení a příznaků

Annotation také poskytuje Color(), Border() a Flags(). Flags() přijímá bitové pole AnnotationFlags — kombinujte hodnoty pomocí bitového OR pro nastavení více než jednoho příznaku najednou:

TextAnnotation flagged{doc};
flagged.Rect(Rectangle(100.0, 600.0, 300.0, 650.0, false));
flagged.Contents("Needs follow-up");
flagged.Color(Color::FromRgb(220, 20, 20));
flagged.Flags(AnnotationFlags::Print | AnnotationFlags::ReadOnly);
flagged.Border().Width(2);
flagged.Border().Style(BorderStyle::Dashed);

page.Annotations().Add(flagged);

Krok 6: Uložte dokument

Nic není zapsáno na disk, dokud se neprovede Save():

doc.Save("annotated.pdf");

Krok 7: Znovu otevřít PDF a přečíst jeho anotace

Znovu otevřete uložený soubor a načtěte zpět AnnotationCollection první stránky. AnnotationCollection je nulově indexováno a Count() udává, kolik anotací stránka obsahuje:

Document reopened("annotated.pdf");
auto& annots = reopened.Pages()[1].Annotations();

std::cout << "Annotation count: " << annots.Count() << "\n";

for (int i = 0; i < annots.Count(); ++i) {
    const auto& a = annots[i];
    if (a.AnnotationType() == AnnotationType::Text) {
        std::cout << "Text annotation: " << a.Contents() << "\n";
    }
}

Krok 8: Odstranit anotaci a znovu uložit

AnnotationCollection::Delete(index) odstraňuje anotaci podle její nulové pozice. Odstraňte první anotaci a výsledek uložte do nového souboru:

annots.Delete(0);
reopened.Save("annotated-cleaned.pdf");

Časté problémy a opravy

Nic se v uloženém PDF po volání nezmění Annotations().Add()

Dvě věci zde často selhávají. Za prvé, PageCollection je založen na 1 (doc.Pages()[1] je první stránka), zatímco AnnotationCollection je založen na 0 (annots[0] je první anotace) — zamíchání těchto dvou schémat indexování vede k operaci na špatném objektu. Za druhé, ověřte, že Document::Save() skutečně běží po přidání anotace; dokud se tak nestane, nic se neukládá na disk.

AnnotationCollection indexování nebo Delete(index) throws std::out_of_range

Platné indexy jsou v rozmezí od 0 do Count() - 1. Předání záporného indexu nebo indexu rovného nebo většího než Count() vyvolá std::out_of_range záměrně. Nejprve zavolejte Count(), abyste omezili jakýkoli cyklus nebo vyhledávání.

Remove() returns false při druhém volání na stejnou anotaci

Nejedná se o chybu. Remove() hlásí, zda byla anotace nalezena a odstraněna jako bool; opětovné volání na anotaci, která již byla odstraněna, není operací a vrací false. Zkontrolujte návratovou hodnotu místo předpokladu, že Remove() vždy uspěje.

Nastavení nového AnnotationFlags hodnota vymaže příznaky, které jsem již nastavil

Flags(value) nahrazuje celý soubor příznaků — neslučuje se s předchozí hodnotou. Pro přidání nebo vymazání jednoho příznaku nejprve přečtěte aktuální příznaky a spojte je pomocí bitových operátorů, například a.Flags(a.Flags() | AnnotationFlags::Print) pro přidání příznaku, nebo a.Flags(a.Flags() & ~AnnotationFlags::Print) pro vymazání jednoho příznaku při zachování ostatních nedotčených.

Často kladené otázky

Jaký je vztah mezi Annotation, TextAnnotation a ostatními podtypy anotací?

Annotation je společná základní třída. TextAnnotation a ostatní konkrétní typy anotací každý ji specializují pro jeden podtyp PDF anotace, přičemž sdílejí přístupové metody Rect(), Contents(), Color(), Flags() a Border() základní třídy.

Jsou anotace omezeny na celý dokument nebo na jednu stránku?

Každá stránka má své vlastní AnnotationCollection, které je vráceno metodou Annotations() té stránky. Anotace jsou vždy vázány na stránku, do které byly přidány, nikoli na celý dokument.

Jak spočítám, kolik anotací je na stránce?

Zavolejte Count() na AnnotationCollection vrácený Page::Annotations().

Může být anotace současně tisknutelná i jen pro čtení?

Ano. AnnotationFlags je bitové pole, takže hodnoty kombinujte pomocí bitového OR, například AnnotationFlags::Print | AnnotationFlags::ReadOnly.

Odstraní smazání anotace z AnnotationCollection ji ze souboru PDF na disku?

Teprve po spuštění Document::Save(). Delete(), Remove() a Clear() pouze upravují kolekci v paměti – PDF na disku zůstává nezměněné, dokud není dokument uložen.

Viz také:

 Čeština