Візуалізація фігур окремо від документа

При обробці документів звичайним завданням є вилучення всіх зображень, знайдених у документі, та експорт їх у зовнішнє сховище. Це завдання спрощується за допомогою функції Aspose.Words API, яка вже забезпечує функціональність для отримання та збереження даних зображень. Однак іноді може знадобитися аналогічно витягти графічний вміст інших типів, представлений іншим типом графічного об’єкта, наприклад, текстове поле, що містить абзаци, фігури зі стрілками та невелике зображення. Простого способу візуалізації цього об’єкта не існує, оскільки він являє собою комбінацію окремих елементів контенту. Ви також можете зіткнутися з випадком, коли вміст було згруповано в об’єкт, який виглядає як єдине зображення.

Aspose.Words надає функціональність для вилучення цього типу вмісту таким же чином, як ви можете витягти просте зображення з shape як відтворюваний вміст. У цій статті описано, як використовувати цю функціональність для візуалізації фігур незалежно від документа.

Типи фігур в Aspose.Words

Весь вміст шару малювання документа представлено вузлом Shape або GroupShape в модулі об’єктів документа Aspose.Words (DOM). Таким вмістом можуть бути текстові поля, зображення, об’єкти AutoShapes, OLE і т.д. деякі поля також імпортуються у вигляді фігур, наприклад, поле INCLUDEPICTURE.

Просте зображення представлено вузлом Shape з ShapeType.Image. Цей вузол форми не має дочірніх вузлів, але до даних зображення, що містяться в цьому вузлі форми, можна отримати доступ за допомогою властивості Shape.ImageData. З іншого боку, фігура також може складатися з багатьох дочірніх вузлів. Наприклад, форма текстового поля, яка представлена властивістю ShapeType.TextBox, може складатися з багатьох вузлів, таких як Paragraph та Table. Більшість форм можуть включати вузли рівня блоку Paragraph та Table. Це ті ж вузли, що і в основній частині документа. Фігури завжди є частинами будь-якого абзацу, або включеними безпосередньо в текст, або прив’язаними до Paragraph,, але “плаваючими” в будь-якому місці сторінки документа.

rendering-shapes-separately-from-a-document-aspose-words-cpp-1

Документ також може містити фігури, які згруповані разом. Групування можна включити в Microsoft Word, вибравши кілька об’єктів і натиснувши “згрупувати” в контекстному меню.

rendering-shapes-separately-from-a-document-aspose-words-cpp-2

У Aspose.Words ці групи фігур представлені вузлом GroupShape. Вони також можуть бути викликані таким же чином, щоб відобразити всю групу на зображенні.

rendering-shapes-separately-from-a-document-aspose-words-cpp-3

Формат DOCX може містити спеціальні типи зображень, такі як діаграми. Ці фігури також представлені за допомогою вузла Shape в Aspose.Words, який також забезпечує подібний метод для їх відображення у вигляді зображень. За задумом, фігура не може містити іншу фігуру в якості дочірньої, якщо тільки ця фігура не є зображенням (ShapeType.Image). Наприклад, Microsoft Word не дозволяє вставляти текстове поле в інше текстове поле.

Описані вище типи фігур забезпечують спеціальний метод візуалізації фігур за допомогою класу ShapeRenderer. Екземпляр класу ShapeRenderer витягується для Shape або GroupShape методом GetShapeRenderer або шляхом передачі Shape конструктору класу ShapeRenderer. Цей клас надає доступ до елементів, які дозволяють відображати форму наступним чином:

  • Файл на диску за допомогою методу перевантаження Save
  • Потік за допомогою перевантаження методу Save
  • Об’єкт Graphics за допомогою методів RenderToSize та RenderToScale

Рендеринг у файл або потік

Метод Save забезпечує перевантаження, які відображають фігуру безпосередньо у файл або потік. Обидва перевантаження підтримують екземпляр класу ImageSaveOptions, який дозволяє визначати параметри для відображення фігури. Це працює так само, як метод Document.Save. Незважаючи на те, що цей параметр є обов’язковим, ви можете передати нульове значення, вказавши, що користувацьких параметрів немає.

Фігура може бути експортована в будь-якому графічному форматі, зазначеному в перерахуванні SaveFormat. Наприклад, зображення можна відобразити як растрове, наприклад, як JPEG, вказавши перерахування SaveFormat.Jpeg, або як векторне, наприклад, як EMF, вказавши SaveFormat.Emf.

Наведений нижче приклад коду ілюструє рендеринг фігури у вигляді зображення EMF окремо від документа і збереження на диск:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<ShapeRenderer> r = shape->GetShapeRenderer();
// Define custom options which control how the image is rendered. Render the shape to the JPEG raster format.
System::SharedPtr<ImageSaveOptions> imageOptions = System::MakeObject<ImageSaveOptions>(SaveFormat::Emf);
imageOptions->set_Scale(1.5f);
System::String outputPath = outputDataDir + u"RenderShape.RenderShapeToDisk.emf";
// Save the rendered image to disk.
r->Save(outputPath, imageOptions);

Наведений нижче приклад коду ілюструє рендеринг фігури у вигляді зображення JPEG окремо від документа і збереження в потоці:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<ShapeRenderer> r = System::MakeObject<ShapeRenderer>(shape);
// Define custom options which control how the image is rendered. Render the shape to the vector format EMF.
System::SharedPtr<ImageSaveOptions> imageOptions = System::MakeObject<ImageSaveOptions>(SaveFormat::Jpeg);
imageOptions->set_ImageColorMode(ImageColorMode::Grayscale);
imageOptions->set_ImageBrightness(0.45f);
System::String outputPath = outputDataDir + u"RenderShape.RenderShapeToStream.jpg";
System::SharedPtr<System::IO::FileStream> stream = System::MakeObject<System::IO::FileStream>(outputPath, System::IO::FileMode::Create);
// Save the rendered image to the stream using different options.
r->Save(stream, imageOptions);

Клас ImageSaveOptions дозволяє задати безліч параметрів, що керують відображенням зображення. Функціональність, описана вище, може бути застосована таким же чином до вузлів GroupShape і Shape.

Рендеринг в графічний об’єкт .NET

Візуалізація безпосередньо в об’єкт Graphics дозволяє визначити власні налаштування та стан об’єкта Graphics. Звичайний сценарій передбачає візуалізацію фігури безпосередньо в об’єкт Graphics, отриманий з форми Windows або растрового зображення. При відображенні вузла Shape параметри впливатимуть на зовнішній вигляд фігури. Наприклад, ви можете обертати або масштабувати фігуру, використовуючи методи RotateTransform або ScaleTransform для об’єкта Graphics.

У наведеному нижче прикладі показано, як отрисовать фігуру для об’єкта .NET Graphics окремо від документа та застосувати поворот до відтвореного зображення:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<ShapeRenderer> r = shape->GetShapeRenderer();
// Find the size that the shape will be rendered to at the specified scale and resolution.
System::Drawing::Size shapeSizeInPixels = r->GetSizeInPixels(1.0f, 96.0f);
// Rotating the shape may result in clipping as the image canvas is too small. Find the longest side
// And make sure that the graphics canvas is large enough to compensate for this.
int32_t maxSide = System::Math::Max(shapeSizeInPixels.get_Width(), shapeSizeInPixels.get_Height());
{
// Clearing resources under 'using' statement
DisposableHolder<System::Drawing::Bitmap> imageHolder(System::MakeObject<System::Drawing::Bitmap>((int32_t)(maxSide * 1.25), (int32_t)(maxSide * 1.25)));
{
// Rendering to a graphics object means we can specify settings and transformations to be applied to
// The shape that is rendered. In our case we will rotate the rendered shape.
// Clearing resources under 'using' statement
DisposableHolder<System::Drawing::Graphics> grHolder(System::Drawing::Graphics::FromImage(imageHolder.GetObject()));
// Clear the shape with the background color of the document.
grHolder.GetObject()->Clear(shape->get_Document()->get_PageColor());
// Center the rotation using translation method below
grHolder.GetObject()->TranslateTransform((float)imageHolder.GetObject()->get_Width() / 8, (float)imageHolder.GetObject()->get_Height() / 2);
// Rotate the image by 45 degrees.
grHolder.GetObject()->RotateTransform(45.0f);
// Undo the translation.
grHolder.GetObject()->TranslateTransform(-(float)imageHolder.GetObject()->get_Width() / 8, -(float)imageHolder.GetObject()->get_Height() / 2);
// Render the shape onto the graphics object.
r->RenderToSize(grHolder.GetObject(), 0.0f, 0.0f, shapeSizeInPixels.get_Width(), shapeSizeInPixels.get_Height());
}
System::String outputPath = outputDataDir + u"RenderShape.RenderShapeToGraphics.png";
imageHolder.GetObject()->Save(outputPath, System::Drawing::Imaging::ImageFormat::get_Png());
std::cout << "Shape rendered to graphics successfully." << std::endl << "File saved at " << outputPath.ToUtf8String() << std::endl;
}

Подібно до методу RenderToSize, метод RenderToSize , успадкований від методу NodeRendererBase, корисний для створення ескізів вмісту документа. Розмір Фігури задається за допомогою конструктора. Метод RenderToSize приймає об’єкт Graphics, координати X та Y положення зображення та розмір зображення (ширина та Висота), які будуть відображені на об’єкті Graphics.

Зображення Shape може бути відображено в певному масштабі за допомогою методу ShapeRenderer.RenderToScale, успадкованого від класу NodeRendererBase. Це аналогічно методу Document.RenderToScale, який приймає ті самі основні параметри. Різниця між цими двома методами полягає в тому, що при використанні методу ShapeRenderer.RenderToScale замість буквального розміру Ви вибираєте значення з плаваючою точкою, яке масштабує фігуру під час її візуалізації. Якщо значення з плаваючою точкою дорівнює 1.0, форма відображатиметься на 100% від початкового розміру. Значення з плаваючою комою 0.5 зменшить розмір зображення вдвічі.

Рендеринг зображення фігури

Клас Shape представляє об’єкти на рівні малювання, такі як AutoShape, текстове поле, довільна форма, об’єкт OLE, елемент керування ActiveX або зображення. Використовуючи клас Shape, ви можете створювати або змінювати фігури в документі Microsoft Word. Важливою властивістю фігури є її значення ShapeType. Фігури різних типів можуть мати різні можливості в документі Word. Наприклад, лише зображення та фігури OLE можуть містити зображення всередині себе, тоді як більшість фігур можуть містити лише текст.

Наступний приклад показує, як перетворити зображення фігури на зображення JPEG окремо від документа та зберегти його на диску:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::String outputPath = outputDataDir + u"RenderShape.RenderShapeImage.jpg";
// Save the Shape image to disk in JPEG format and using default options.
shape->GetShapeRenderer()->Save(outputPath, nullptr);

Отримання розміру фігури

Клас ShapeRenderer також надає функціональні можливості для отримання розміру фігури в пікселях за допомогою методу GetSizeInPixels. Цей метод приймає два параметри типу float (одиночних) – масштаб і DPI, які використовуються при обчисленні розміру фігури при її візуалізації. Метод повертає об’єкт Size, який містить Ширину та висоту обчисленого розміру. Це корисно, коли потрібно заздалегідь знати розмір візуалізується фігури, наприклад, при створенні нового растрового зображення на основі результатів візуалізації.

У наведеному нижче прикладі показано, як створити нове растрове зображення та графічний об’єкт із шириною та висотою фігури, яка відображатиметься:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::Drawing::SizeF shapeSizeInDocument = shape->GetShapeRenderer()->get_SizeInPoints();
float width = shapeSizeInDocument.get_Width();
// The width of the shape.
float height = shapeSizeInDocument.get_Height();
// The height of the shape.
System::Drawing::Size shapeRenderedSize = shape->GetShapeRenderer()->GetSizeInPixels(1.0f, 96.0f);
{
// Clearing resources under 'using' statement
DisposableHolder<System::Drawing::Bitmap> imageHolder(System::MakeObject<System::Drawing::Bitmap>(shapeRenderedSize.get_Width(), shapeRenderedSize.get_Height()));
{
// Clearing resources under 'using' statement
DisposableHolder<System::Drawing::Graphics> gHolder(System::Drawing::Graphics::FromImage(imageHolder.GetObject()));
// Render shape onto the graphics object using the RenderToScale or RenderToSize methods of ShapeRenderer class.
}
}

При використанні методів RenderToSize або RenderToScale Розмір відображуваного зображення також повертається до об’єкта SizeF. Це значення можна присвоїти змінній і використовувати при необхідності.

Властивість SizeInPoints повертає розмір Фігури, виміряний у точках (див. ShapeRenderer. Результатом є об’єкт SizeF, що містить ширину та висоту.