Дополнительные аннотации с использованием C++
Как добавить аннотацию Caret в существующий PDF-файл
Аннотация Caret — это символ, указывающий на редактирование текста. Аннотация Caret также является аннотацией разметки, поэтому класс Caret наследуется от класса Markup и также предоставляет функции для получения или установки свойств аннотации Caret и сброса потока внешнего вида аннотации Caret.
Шаги, с помощью которых мы создаем аннотацию Caret:
- Загрузите PDF-файл - новый Document.
- Создайте новую Caret Annotation и установите параметры Caret (новый Rectangle, title, Subject, Flags, color, width, StartingStyle и EndingStyle). Эта аннотация используется для указания вставки текста.
- Создайте новую Caret Annotation и установите параметры Caret (новый Rectangle, title, Subject, Flags, color, width, StartingStyle и EndingStyle). Эта аннотация используется для указания замены текста.
- Создайте новую StrikeOutAnnotation и установите параметры (новый Rectangle, title, color, new QuadPoints и new points, Subject, InReplyTo, ReplyType).
- После этого мы можем добавить аннотации на страницу.
Следующий фрагмент кода показывает, как добавить аннотацию Caret в PDF файл:
using namespace System;
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Text;
using namespace Aspose::Pdf::Annotations;
void MarkupAnnotations::AddCaretAnnotation() {
String _dataDir("C:\\Samples\\");
// Загружаем PDF файл
auto document = MakeObject<Document>(_dataDir + u"sample.pdf");
// Эта аннотация используется для указания вставки текста
auto caretAnnotation1 = MakeObject<CaretAnnotation>(
document->get_Pages()->idx_get(1),
MakeObject<Rectangle>(299.988, 713.664, 308.708, 720.769));
caretAnnotation1->set_Title(u"Aspose User");
caretAnnotation1->set_Subject(u"Inserted text 1");
caretAnnotation1->set_Flags(AnnotationFlags::Print);
caretAnnotation1->set_Color(Color::get_Blue());
// Эта аннотация используется для указания замены текста
auto caretAnnotation2 = MakeObject<CaretAnnotation>(
document->get_Pages()->idx_get(1),
new Rectangle(361.246, 727.908, 370.081, 735.107));
caretAnnotation2->set_Title(u"Aspose User");
caretAnnotation2->set_Flags(AnnotationFlags::Print);
caretAnnotation2->set_Subject(u"Inserted text 2");
caretAnnotation2->set_Color(Color::get_Blue());
auto strikeOutAnnotation = MakeObject<StrikeOutAnnotation>(
document->get_Pages()->idx_get(1),
MakeObject<Rectangle>(318.407, 727.826, 368.916, 740.098));
strikeOutAnnotation->set_Color(Color::get_Blue());
strikeOutAnnotation->set_QuadPoints(
MakeArray<System::SharedPtr<Point>>({
MakeObject<Point>(321.66, 739.416),
MakeObject<Point>(365.664, 739.416),
MakeObject<Point>(321.66, 728.508),
MakeObject<Point>(365.664, 728.508) }));
strikeOutAnnotation->set_Subject(u"Cross-out");
strikeOutAnnotation->set_InReplyTo(caretAnnotation2);
strikeOutAnnotation->set_ReplyType(ReplyType::Group);
document->get_Pages()->idx_get(1)->get_Annotations()->Add(caretAnnotation1);
document->get_Pages()->idx_get(1)->get_Annotations()->Add(caretAnnotation2);
document->get_Pages()->idx_get(1)->get_Annotations()->Add(strikeOutAnnotation);
document->Save(_dataDir + u"sample_caret.pdf");
}
Получить Аннотацию Caret
Пожалуйста, попробуйте использовать следующий фрагмент кода, чтобы получить аннотацию Caret в PDF-документе
void MarkupAnnotations::GetCaretAnnotation() {
String _dataDir("C:\\Samples\\");
// Загрузить PDF файл
auto document = MakeObject<Document>(_dataDir + u"sample_caret.pdf");
// Фильтр аннотаций с использованием AnnotationSelector
auto page = document->get_Pages()->idx_get(1);
auto annotationSelector = MakeObject<AnnotationSelector>(
MakeObject<CaretAnnotation>(page, Rectangle::get_Trivial()));
page->Accept(annotationSelector);
auto caretAnnotations = annotationSelector->get_Selected();
// вывести результаты
for (auto ca : caretAnnotations) {
Console::WriteLine(ca->get_Rect());
}
}
Удалить Аннотацию Caret
Следующий фрагмент кода показывает, как удалить аннотацию Caret из PDF файла.
void MarkupAnnotations::DeleteCaretAnnotation() {
String _dataDir("C:\\Samples\\");
// Загрузить PDF файл
auto document = MakeObject<Document>(_dataDir + u"sample_caret.pdf");
// Фильтр аннотаций с использованием AnnotationSelector
auto page = document->get_Pages()->idx_get(1);
auto annotationSelector = MakeObject<AnnotationSelector>(
MakeObject<CaretAnnotation>(page, Rectangle::get_Trivial()));
page->Accept(annotationSelector);
auto caretAnnotations = annotationSelector->get_Selected();
// удалить аннотацию
for (auto ca : caretAnnotations) {
document->get_Pages()->idx_get(1)->get_Annotations()->Delete(ca);
}
document->Save(_dataDir + u"sample_caret_del.pdf");
}
Как добавить аннотацию ссылки
Аннотация ссылки — это гипертекстовая ссылка, которая ведет к месту назначения в другом месте документа или к действию, которое нужно выполнить.
Ссылка — это прямоугольная область, которую можно разместить в любом месте на странице. Каждая ссылка имеет соответствующее действие в PDF, связанное с ней. Это действие выполняется, когда пользователь нажимает в области этой ссылки.
Следующий фрагмент кода показывает, как добавить аннотацию ссылки в PDF файл, используя пример с номером телефона:
using namespace System;
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Text;
void AddLinkAnnotation() {
String _dataDir("C:\\Samples\\");
// Загрузить PDF файл
auto document = MakeObject<Document>(_dataDir + u"sample.pdf");
auto page = document->get_Pages()->idx_get(1);
// Создать объект TextFragmentAbsorber для поиска номера телефона
auto textFragmentAbsorber = MakeObject<Aspose::Pdf::Text::TextFragmentAbsorber>("678-555-0103");
// Применить абсорбер только для 1-й страницы
page->Accept(textFragmentAbsorber);
auto phoneNumberFragment = textFragmentAbsorber->get_TextFragments()->idx_get(1);
// Создать аннотацию ссылки и задать действие для вызова номера телефона
auto linkAnnotation = MakeObject<Aspose::Pdf::Annotations::LinkAnnotation>(page, phoneNumberFragment->get_Rectangle());
linkAnnotation->set_Action(MakeObject<Aspose::Pdf::Annotations::GoToURIAction>("callto:678-555-0103"));
// Добавить аннотацию на страницу
page->get_Annotations()->Add(linkAnnotation);
document->Save(_dataDir + u"SimpleResume_mod.pdf");
}
Получить Аннотацию Ссылки
Пожалуйста, попробуйте использовать следующий фрагмент кода, чтобы получить LinkAnnotation из PDF документа.
void GetLinkAnnotations() {
String _dataDir("C:\\Samples\\");
// Загрузить PDF файл
auto document = MakeObject<Document>(_dataDir + u"SimpleResume_mod.pdf");
// Фильтрация аннотаций с использованием AnnotationSelector
auto page = document->get_Pages()->idx_get(1);
auto annotationSelector = MakeObject<Aspose::Pdf::Annotations::AnnotationSelector>(
MakeObject<Aspose::Pdf::Annotations::LinkAnnotation>(page, Rectangle::get_Trivial(), Point::get_Trivial(), Point::get_Trivial()));
page->Accept(annotationSelector);
auto linkAnnotations = annotationSelector->get_Selected();
// вывод результатов
for (auto la : linkAnnotations) {
auto l = System::DynamicCast<Aspose::Pdf::Annotations::LinkAnnotation>(la);
// Вывести URL каждой аннотации ссылки
Console::WriteLine(u"URI: " + System::DynamicCast<Aspose::Pdf::Annotations::GoToURIAction>(l->get_Action())->get_URI());
auto absorber = MakeObject<TextAbsorber>();
absorber->get_TextSearchOptions()->set_LimitToPageBounds(true);
absorber->get_TextSearchOptions()->set_Rectangle(l->get_Rect());
page->Accept(absorber);
String extractedText = absorber->get_Text();
// Вывести текст, связанный с гиперссылкой
Console::WriteLine(extractedText);
}
}
Удаление Аннотации Ссылки
Следующий фрагмент кода показывает, как удалить аннотацию ссылки из PDF-файла. Для этого нам нужно найти и удалить все аннотации ссылок на первой странице. После этого мы сохраним документ с удаленной аннотацией.
void DeleteLinkAnnotations()
{
String _dataDir("C:\\Samples\\");
// Загрузить PDF файл
auto document = MakeObject<Document>(_dataDir + u"SimpleResume_mod.pdf");
// Фильтрация аннотаций с использованием AnnotationSelector
auto page = document->get_Pages()->idx_get(1);
auto annotationSelector = MakeObject<Aspose::Pdf::Annotations::AnnotationSelector>(
MakeObject<Aspose::Pdf::Annotations::LinkAnnotation>(page, Rectangle::get_Trivial(), Point::get_Trivial(), Point::get_Trivial()));
page->Accept(annotationSelector);
auto lineAnnotations = annotationSelector->get_Selected();
// вывод результатов
for (auto la : lineAnnotations) {
page->get_Annotations()->Delete(la);
}
// Сохранить документ с удаленной аннотацией
document->Save(_dataDir + u"SimpleResume_del.pdf");
}
Редактирование определенной области страницы с помощью аннотации редактирования в Aspose.PDF для C++
Aspose.PDF для C++ поддерживает возможность добавления и управления аннотациями в существующем PDF-файле. Недавно некоторые из наших клиентов запросили возможность редактирования (удаления текста, изображений и т.д.) определенной области страницы PDF-документа. Для выполнения этого требования предоставлен класс с именем RedactionAnnotation, который может быть использован для редактирования определенных областей страницы или для управления существующими RedactionAnnotations и их редактирования (т.е. упрощения аннотации и удаления текста под ней).
using namespace System;
using namespace Aspose::Pdf;
using namespace Aspose::Pdf::Text;
using namespace Aspose::Pdf::Annotations;
void RedactAnnotation::AddRedactionAnnotation() {
String _dataDir("C:\\Samples\\");
// Открыть документ
auto document = MakeObject<Document>(_dataDir + u"sample.pdf");
auto page = document->get_Pages()->idx_get(1);
// Создать экземпляр RedactionAnnotation для определенной области страницы
auto annot = MakeObject<RedactionAnnotation>(page, MakeObject<Rectangle>(200, 500, 300, 600));
annot->set_FillColor(Color::get_Green());
annot->set_BorderColor(Color::get_Yellow());
annot->set_Color(Color::get_Blue());
// Текст, который будет напечатан на аннотации редактирования
annot->set_OverlayText(u"REDACTED");
annot->set_TextAlignment(HorizontalAlignment::Center);
// Повторить текст наложения на аннотации редактирования
annot->set_Repeat(true);
// Добавить аннотацию в коллекцию аннотаций первой страницы
page->get_Annotations()->Add(annot);
// Упрощает аннотацию и редактирует содержимое страницы (т.е. удаляет текст и изображения
// Под редактированной аннотацией)
annot->Redact();
document->Save(_dataDir + u"RedactPage_out.pdf");
}
Подход с фасадами
Aspose.PDF.Facades поддерживает класс PdfAnnotationEditor, который предоставляет возможность управлять существующими аннотациями внутри PDF-файла.
Этот класс содержит метод под названием RedactArea(..), который предоставляет возможность удалять определенные области страницы.
void RedactAnnotation::AddRedactionAnnotationViaFacades() {
String _dataDir("C:\\Samples\\");
auto editor = MakeObject<Aspose::Pdf::Facades::PdfAnnotationEditor>();
editor->BindPdf(_dataDir + u"sample.pdf");
// Редактирование определенной области страницы
editor->RedactArea(1, MakeObject<Rectangle>(100, 100, 20, 70), System::Drawing::Color::get_White());
editor->BindPdf(_dataDir + u"sample.pdf");
editor->Save(_dataDir + u"FacadesApproach_out.pdf");
}