บทนำ

การทำเครื่องหมาย PDF ครอบคลุมช่วงกว้างขององค์ประกอบเชิงโต้ตอบและภาพที่จัดเรียงอยู่เหนือเนื้อหาหน้า: โน้ตข้อความแบบสติ๊กกี้, ไฮเปอร์ลิงก์, ข้อความที่เน้นสีหรือขีดฆ่า, รูปร่างเรขาคณิต, เส้นหมึก, ไฟล์แนบ, และตราการอนุมัติ. Aspose.PDF FOSS สำหรับ C++ แสดงถึงแต่ละรายการเหล่านี้เป็นคลาสย่อยที่เป็นรูปธรรมของ Annotation ดังนั้นโค้ดที่วนผ่านการทำเครื่องหมายของหน้า สามารถทำงานแบบทั่วไปกับคลาสฐานในขณะที่ยังเข้าถึงสมาชิกเฉพาะของชนิดย่อยได้ — เช่น Icon() บน TextAnnotation หรือ Action() บน LinkAnnotation — เมื่อจำเป็น.

ไลบรารี Annotations::AnnotationType enum ระบุชนิดย่อยที่รองรับ: Text, Link, FreeText, Line, Square, Circle, Polygon, PolyLine, Highlight, Underline, Squiggly, StrikeOut, Stamp, Caret, Ink, Popup, FileAttachment, Sound, Movie, Widget, Screen, PrinterMark, Watermark, Redaction, RichMedia และอื่น ๆ อีกหลายรายการ. แต่ละค่าจะแมปไปยังคลาสที่เป็นคอนกรีต — CircleAnnotation, SquareAnnotation, PolygonAnnotation, PolylineAnnotation, และ LineAnnotation สำหรับการทำเครื่องหมายรูปทรง; FreeTextAnnotation และ InkAnnotation สำหรับข้อความอิสระและเส้นที่วาด; FileAttachmentAnnotation, SoundAnnotation, MovieAnnotation, ScreenAnnotation, และ RichMediaAnnotation สำหรับเนื้อหาแบบฝัง; และ WidgetAnnotation สำหรับการแสดงผลฟิลด์ AcroForm.

โพสต์นี้ครอบคลุมฐาน API ของ Annotation และ AnnotationCollection โดยเพิ่มโน้ตข้อความและลิงก์, ตรวจจับประเภทของคำอธิบายเมื่อโหลดเอกสารที่มีอยู่, และอ่านหรืออัปเดตเมตาดาต้าและตราประทับของมาร์กอัป. Aspose.PDF FOSS สำหรับ C++ เป็นไลบรารี C++20 ที่ไม่มีการพึ่งพารันไทม์นอกจากไลบรารีมาตรฐาน; ส่วนหัวถูกนำเข้าตรงจากไดเรกทอรี aspose/pdf/annotations/ และไลบรารีจะสร้างเป็นเป้าหมายของ CMake.


สิ่งที่รวมอยู่

Annotation และ AnnotationCollection

Annotation เป็นคลาสฐานสำหรับทุกชนิดของคำอธิบายประกอบย่อย มันเปิดเผยคุณสมบัติที่ใช้ร่วมกัน: Rect() / Rect(value) สำหรับสี่เหลี่ยมขอบเขตของคำอธิบาย, Contents() สำหรับข้อความที่เกี่ยวข้อง, Name(), Color(), Flags() (บิตมาสก์ AnnotationFlagsPrint, Hidden, Invisible, NoZoom, ReadOnly และอื่นๆ), Border(), Width() / Height(), AnnotationType(), และ PageIndex(). AnnotationCollection เก็บคำอธิบายบนหน้าเดียวและเข้าถึงได้ผ่าน Page.Annotations().

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

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

Document doc("reviewed.pdf");
AnnotationCollection& annots = doc.Pages()[1].Annotations();

std::cout << "Annotation count: " << annots.Count() << "\n";
for (int i = 0; i < annots.Count(); ++i) {
    Annotation& a = annots[i];
    std::cout << "  " << a.Name() << ": " << a.Contents() << "\n";
}

AnnotationCollection ยังเปิดเผย Add(annotation), Add(annotation, considerRotation), Delete(index), Delete(annotation), Clear(), Remove(annotation), Contains(annotation) และ IsReadOnly() .

บันทึกข้อความด้วย TextAnnotation

TextAnnotation แสดงถึงคอมเมนต์แบบโน้ตติดที่คุ้นเคย. นอกเหนือจากสมาชิกฐานของ Annotation มันเพิ่ม Open() / Open(value) เพื่อควบคุมว่าบันทึกจะแสดงขยายหรือไม่, และ Icon() / Icon(value) (ค่าของ TextIcon เช่น Note, Comment, Key, Help, หรือ Check) เพื่อเลือกไอคอน glyph.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/text_annotation.hpp>

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

Document doc("input.pdf");

TextAnnotation note{doc};
note.Rect(Rectangle{100.0, 700.0, 200.0, 720.0, false});
note.Contents("Reviewed by QA");
note.Icon(TextIcon::Comment);
note.Open(true);

doc.Pages()[1].Annotations().Add(note);
doc.Save("annotated.pdf");

ลิงก์และการกระทำด้วย LinkAnnotation

LinkAnnotation เชื่อมต่อพื้นที่ที่คลิกได้กับหน้า. มันถูกสร้างจาก Page เจ้าของและ Rectangle, และพฤติกรรมของมันตั้งค่าด้วย Action(value) — ใด ๆ ที่เป็น subclass ของ PdfAction, รวมถึง NamedAction (การนำทางที่กำหนดไว้ล่วงหน้าเช่น PredefinedAction::LastPage), GoToAction, GoToURIAction, หรือ JavascriptAction. Destination() อ่านเป้าหมาย IAppointment ของลิงก์, และ Highlighting() / Highlighting(value) ตั้งค่า HighlightingMode (None, Invert, Outline, Push, Toggle) ที่ใช้เมื่อเปิดลิงก์.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/link_annotation.hpp>
#include <aspose/pdf/annotations/named_action.hpp>

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

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

LinkAnnotation link{page, Rectangle{0.0, 0.0, 100.0, 20.0, false}};
link.Action(NamedAction{PredefinedAction::LastPage});
link.Highlighting(HighlightingMode::Push);

page.Annotations().Add(link);

การตรวจจับประเภท Annotation เมื่อโหลด

เมื่อเปิดเอกสาร, annotation ที่มีอยู่แล้วจะถูกเติมเต็มไว้ใน AnnotationCollection ของแต่ละหน้า, และ AnnotationType() ระบุว่าแต่ละรายการเป็น subtype ใดที่เป็น concrete. สิ่งนี้ทำให้โค้ดที่เรียกสามารถแยกสาขาตามค่า enum ได้โดยไม่ต้องรู้ล่วงหน้าว่า PDF มีประเภท annotation ใดบ้าง.

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

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

Document doc("mixed-annotations.pdf");
auto& annots = doc.Pages()[1].Annotations();

for (int i = 0; i < annots.Count(); ++i) {
    switch (annots[i].AnnotationType()) {
        case AnnotationType::Text:      std::cout << "Text note\n"; break;
        case AnnotationType::Link:      std::cout << "Link\n"; break;
        case AnnotationType::Circle:    std::cout << "Circle shape\n"; break;
        case AnnotationType::Square:    std::cout << "Square shape\n"; break;
        case AnnotationType::Highlight: std::cout << "Highlight\n"; break;
        case AnnotationType::Stamp:     std::cout << "Stamp\n"; break;
        default: break;
    }
}

เมตาดาต้า Annotation แบบมาร์คอัป

MarkupAnnotation เป็นฐานสำหรับ annotation ที่บรรจุข้อมูลเมตาดาต้าของผู้ตรวจสอบ: Title() (ผู้เขียน), Subject(), RichText() สำหรับข้อความคอมเมนต์ที่ฟอร์แมต, และ Opacity() สำหรับการผสมกับเนื้อหาหน้า. InReplyTo() และ Popup() เชื่อมโยง markup annotation กับเธรดคอมเมนต์ที่มันเป็นส่วนหนึ่ง, และ ClearState() / SetReviewState(state, userName) จัดการสถานะการตรวจสอบของมัน. HighlightAnnotation, UnderlineAnnotation, StrikeOutAnnotation, และ SquigglyAnnotation เป็น subtype ของ markup ที่วางเหนือข้อความ; ฐานร่วม TextMarkupAnnotation ของพวกมันเพิ่ม QuadPoints() เพื่อกำหนดพื้นที่สี่เหลี่ยมที่ครอบคลุมและ GetMarkedText() เพื่ออ่านข้อความที่อยู่ด้านล่าง.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/markup_annotation.hpp>

using namespace Aspose::Pdf::Annotations;

for (int i = 0; i < annots.Count(); ++i) {
    if (auto* markup = dynamic_cast<MarkupAnnotation*>(&annots[i])) {
        markup->Title("QA Reviewer");
        markup->Subject("Layout issue");
        markup->Opacity(0.6);
    }
}

คำอธิบายแบบแสตมป์ด้วย StampAnnotation

StampAnnotation วางตราประทับที่กำหนดไว้ล่วงหน้าหรือกำหนดเองบนหน้า. Icon() / Icon(value) เลือกค่า StampIconApproved, Draft, Confidential, Final, Expired, NotApproved, ForComment, TopSecret และอื่น ๆ — และ Image() / Image(value) จัดหาข้อมูลไบต์ของรูปภาพดิบสำหรับลักษณะตราประทับที่กำหนดเองแทนไอคอนที่มีมาในระบบ.

#include <aspose/pdf/document.hpp>
#include <aspose/pdf/annotations/stamp_annotation.hpp>

using namespace Aspose::Pdf::Annotations;

for (int i = 0; i < annots.Count(); ++i) {
    if (auto* stamp = dynamic_cast<StampAnnotation*>(&annots[i])) {
        stamp->Icon(StampIcon::Approved);
    }
}

เริ่มต้นอย่างรวดเร็ว

เพิ่มไลบรารีเป็น subdirectory ของ CMake และลิงก์กับ target aspose_pdf_foss:

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

เปิดเอกสาร, เพิ่มโน้ตข้อความ, และอ่านจำนวนคำอธิบายกลับมา:

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

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

int main() {
    Document doc("input.pdf");

    TextAnnotation note{doc};
    note.Rect(Rectangle{100.0, 700.0, 200.0, 720.0, false});
    note.Contents("Reviewed by QA");
    note.Icon(TextIcon::Comment);

    doc.Pages()[1].Annotations().Add(note);
    doc.Save("annotated.pdf");

    std::cout << "Annotations on page 1: "
              << doc.Pages()[1].Annotations().Count() << "\n";
}

รูปแบบที่รองรับ

รูปแบบส่วนขยายอ่านเขียน
BMP.bmp
JPEG.jpg
TIFF.tiff
Text.txt
SVG.svg

การสนับสนุนรูปแบบใช้กับการเรนเดอร์หน้าและตัวเลือกการโหลดในระดับเอกสาร; รายการเหล่านี้สะท้อนการส่งออกที่ยืนยันแล้ว (BmpDevice, JpegDevice, TiffDevice, TextDevice) และการนำเข้า (SvgLoadOptions) แทนการทำซีเรียลไลเซชันเฉพาะคำอธิบาย.


โอเพนซอร์สและการให้สิทธิ์

Aspose.PDF FOSS for C++ ถูกปล่อยภายใต้สัญญาอนุญาต MIT. โค้ดต้นฉบับสามารถเข้าถึงได้ที่ https://github.com/aspose-pdf-foss/Aspose.PDF-FOSS-for-Cpp, และไลบรารีสามารถใช้ในโครงการเชิงพาณิชย์และโอเพ่นซอร์สได้โดยไม่มีค่าธรรมเนียมการใช้ลิขสิทธิ์.


เริ่มต้นใช้งาน

แหล่งข้อมูลที่เกี่ยวข้อง