C++'ta PDF Açıklamalarıyla Nasıl Çalışılır

C++'ta PDF Açıklamalarıyla Nasıl Çalışılır

Aspose.PDF FOSS for C++ her PDF açıklamasını ortak Annotation temel sınıfının bir alt sınıfı olarak temsil eder ve açıklamaları, Page::Annotations() tarafından döndürülen AnnotationCollection aracılığıyla bir sayfada ortaya çıkarır. Bu kılavuz, TextAnnotation ile bir düz metin-not açıklaması ve stillendirilmiş bir açıklama ekler, belgeyi kaydeder, ardından açıklamaları geri okumak ve birini kaldırmak için belgeyi tekrar açar. Kütüphane, bir alt dizin bağımlılığı olarak bir CMake projesine entegre edilmiştir — paket kaydı kurulum adımı yoktur.

Adım Adım Kılavuz

Adım 1: Paketi Yükle

Kütüphaneyi bir CMake alt dizini olarak ekleyin ve statik kütüphane hedefini bağlayın:

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

Araç zincirini ve bağlama adımını minimal bir programla doğru çözüldüğünü doğrulayın:

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

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

Başarılı bir derleme, pages: 0 yazdırdığında, kütüphanenin bağlandığını doğrular.


Adım 2: Gerekli Sınıfları İçe Aktar

#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;

Adım 3: Bir Belge Oluştur ve Bir Sayfa Ekle

Yeni bir belge oluştur ve ona bir sayfa ekle. PageCollection::Add() yeni eklenen Pagei döndürür:

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

Adım 4: Sayfaya Metin Açıklaması Ekle

TextAnnotation yapışkan-not tarzı bir yorum olarak görüntülenir. Sahibi olan Document üzerinden oluşturun, konumunu Rect() ile ve mesajını Contents() ile ayarlayın, ardından sayfanın AnnotationCollectionına ekleyin:

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

page.Annotations().Add(note);

Adım 5: İkinci Açıklamayı Renk, Kenarlık ve Bayraklarla Stilize Et

Annotation ayrıca Color(), Border() ve Flags() öğelerini ortaya çıkarır. Flags(), bir AnnotationFlags bit alanı alır — birden fazla bayrağı aynı anda ayarlamak için değerleri bitwise OR ile birleştirin:

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);

Adım 6: Belgeyi Kaydet

Disk üzerine hiçbir şey, Save() çalıştırılana kadar yazılmaz:

doc.Save("annotated.pdf");

Adım 7: PDF’yi yeniden aç ve açıklamalarını oku

Kaydedilen dosyayı yeniden aç ve ilk sayfasının AnnotationCollection değerini geri oku. AnnotationCollection 0 tabanlıdır ve Count(), sayfanın kaç açıklama içerdiğini rapor eder:

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";
    }
}

Adım 8: Bir açıklamayı kaldır ve yeniden kaydet

AnnotationCollection::Delete(index), bir açıklamayı 0 tabanlı konumuna göre kaldırır. İlk açıklamayı sil ve sonucu yeni bir dosyaya kaydet:

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

Yaygın Sorunlar ve Çözümler

Çağırdıktan sonra kaydedilen PDF’de hiçbir şey değişmez Annotations().Add()

Burada iki şey genellikle yanlış gider. İlk olarak, PageCollection 1 tabanlıdır (doc.Pages()[1] ilk sayfadır) ancak AnnotationCollection 0 tabanlıdır (annots[0] ilk açıklamadır) — iki indeksleme şemasını karıştırmak yanlış nesne üzerinde işlem yapılmasına neden olur. İkinci olarak, Document::Save()‘ın açıklama eklendikten sonra gerçekten çalıştığını doğrulayın; o zamana kadar hiçbir şey diske yazılmaz.

AnnotationCollection indeksleme ya da Delete(index) throws std::out_of_range

Geçerli indeksler 0 ile Count() - 1 arasındadır. Negatif bir indeks ya da Count()‘ye eşit ya da daha büyük bir indeks vermek tasarım gereği std::out_of_range fırlatır. Herhangi bir döngüyü ya da aramayı sınırlamak için önce Count()‘ı çağırın.

Remove() returns false aynı annotation üzerinde ikinci kez çağırdığımda

Bu bir hata değildir. Remove(), açıklamanın bool olarak bulunup kaldırılıp kaldırılmadığını rapor eder; zaten silinmiş bir açıklama üzerinde tekrar çağırmak hiçbir işlem yapmaz ve false döndürür. Remove()‘ün her zaman başarılı olduğunu varsaymak yerine dönüş değerini kontrol edin.

Yeni bir AnnotationFlags değer, daha önce ayarladığım bayrakları temizler

Flags(value), tüm bayrak kümesini değiştirir — önceki değerle birleştirmez. Tek bir bayrak eklemek veya temizlemek için önce mevcut bayrakları okuyun ve bit düzeyinde operatörlerle birleştirin; örneğin bir bayrak eklemek için a.Flags(a.Flags() | AnnotationFlags::Print), geri kalanını dokunulmaz bırakırken bir bayrağı temizlemek için a.Flags(a.Flags() & ~AnnotationFlags::Print).

Sıkça Sorulan Sorular

Annotation, TextAnnotation ve diğer açıklama alt tipleri arasındaki ilişki nedir?

Annotation ortak temel sınıftır. TextAnnotation ve diğer somut açıklama tipleri her biri bir PDF açıklama alt tipi için onu özelleştirir, aynı zamanda temel sınıfın Rect(), Contents(), Color(), Flags() ve Border() erişimcilerini paylaşırlar.

Açıklamalar tüm belgeye mi yoksa tek bir sayfaya mı sınırlıdır?

Her sayfanın kendi AnnotationCollection bulunur ve bu, o sayfanın Annotations() yöntemiyle döndürülür. Açıklamalar her zaman eklendikleri sayfaya sınırlıdır, tüm belgeye değil.

Bir sayfada kaç açıklama olduğunu nasıl sayarım?

Page::Annotations() tarafından döndürülen AnnotationCollection üzerinde Count() çağırın.

Bir açıklama aynı anda hem yazdırılabilir hem de yalnızca okunabilir olabilir mi?

Evet. AnnotationFlags bir bit alanıdır, bu yüzden değerleri bitwise OR ile birleştirin, örneğin AnnotationFlags::Print | AnnotationFlags::ReadOnly.

Bir açıklamayı AnnotationCollection üzerinden silmek, diskteki PDF dosyasından da kaldırır mı?

Yalnızca Document::Save() çalıştıktan sonra. Delete(), Remove() ve Clear() yalnızca bellek içi koleksiyonu değiştirir — diskteki PDF, belge kaydedilene kadar değişmez.

Ayrıca Bakınız

 Türkçe