บทนำ
การทำเครื่องหมาย 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() (บิตมาสก์ AnnotationFlags — Print, 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) เลือกค่า StampIcon — Approved, 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, และไลบรารีสามารถใช้ในโครงการเชิงพาณิชย์และโอเพ่นซอร์สได้โดยไม่มีค่าธรรมเนียมการใช้ลิขสิทธิ์.