Renderowanie kształtów oddzielnie od dokumentu

Podczas przetwarzania dokumentów częstym zadaniem jest wyodrębnienie wszystkich obrazów znajdujących się w dokumencie i wyeksportowanie ich do lokalizacji zewnętrznej. To zadanie staje się proste dzięki Aspose.Words API, który już zapewnia funkcję wyodrębniania i zapisywania danych obrazu. Czasami jednak możesz chcieć podobnie wyodrębnić inne typy zawartości graficznej, które są reprezentowane przez inny typ obiektu rysunku, na przykład pole tekstowe zawierające akapity, kształty strzałek i mały obraz. Nie ma prostego sposobu renderowania tego obiektu, ponieważ jest to połączenie poszczególnych elementów treści. Możesz również napotkać przypadek, gdy zawartość została zgrupowana w obiekt, który wygląda jak pojedynczy obraz.

Aspose.Words zapewnia funkcjonalność wyodrębniania tego typu treści w taki sam sposób, w jaki można wyodrębnić prosty obraz z kształtu jako renderowaną zawartość. W tym artykule opisano, jak wykorzystać tę funkcję do renderowania kształtów niezależnie od dokumentu.

Typy kształtów w Aspose.Words

Cała zawartość warstwy rysunku dokumentu jest reprezentowana przez węzeł Shape lub GroupShape w module obiektu dokumentu Aspose.Words (DOM). Takimi treściami mogą być pola tekstowe, obrazy, AutoShapes, OLE obiekty itp. Niektóre pola są również importowane jako kształty, na przykład pole INCLUDEPICTURE.

Prosty obraz jest reprezentowany przez węzeł Shape z ShapeType.Image. Ten węzeł kształtu nie ma węzłów potomnych, ale do danych obrazu zawartych w tym węźle kształtu można uzyskać dostęp za pomocą właściwości Shape.ImageData. Z drugiej strony kształt może również składać się z wielu węzłów potomnych. Na przykład kształt pola tekstowego, który jest reprezentowany przez właściwość ShapeType.TextBox, może składać się z wielu węzłów, takich jak Paragraph i Table. Większość kształtów może zawierać węzły na poziomie bloków Paragraph i Table. Są to te same węzły, które pojawiają się w głównym ciele. Kształty są zawsze częściami jakiegoś akapitu, umieszczonymi bezpośrednio w wierszu lub zakotwiczonymi w Paragraph,, ale “unoszącymi się” w dowolnym miejscu strony dokumentu.

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

Dokument może również zawierać kształty, które są zgrupowane razem. Grupowanie można włączyć w Microsoft Word, wybierając wiele obiektów i klikając “Grupuj” w menu prawym przyciskiem myszy.

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

W Aspose.Words te grupy kształtów są reprezentowane przez węzeł GroupShape. Można je również wywołać w ten sam sposób, aby renderować całą grupę do obrazu.

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

Format DOCX może zawierać specjalne typy obrazów, takie jak diagramy lub wykresy. Kształty te są również reprezentowane przez węzeł Shape w Aspose.Words, który zapewnia również podobną metodę renderowania ich jako obrazów. Z założenia kształt nie może zawierać innego kształtu jako dziecka, chyba że ten kształt jest obrazem (ShapeType.Image). Na przykład Microsoft Word nie pozwala na wstawienie pola tekstowego do innego pola tekstowego.

Typy kształtów opisane powyżej zapewniają specjalną metodę renderowania kształtów za pomocą klasy ShapeRenderer. Instancja klasy ShapeRenderer jest pobierana dla Shape lub GroupShape za pomocą metody GetShapeRenderer lub przekazując Shape do konstruktora klasy ShapeRenderer. Ta klasa zapewnia dostęp do członków, które umożliwiają renderowanie kształtu do następujących:

  • Plik na dysku przy użyciu metody Save przeciążenie
  • Strumień przy użyciu przeciążenia metody Save
  • Obiekt Graphics przy użyciu metod RenderToSize i RenderToScale

Renderowanie do pliku lub strumienia

Metoda Save zapewnia przeciążenia, które renderują kształt bezpośrednio do pliku lub strumienia. Oba przeciążenia akceptują wystąpienie klasy ImageSaveOptions, która umożliwia zdefiniowanie opcji renderowania kształtu. Działa to w taki sam sposób, jak Metoda Document.Save. Nawet jeśli ten parametr jest wymagany, możesz przekazać wartość null, określając, że nie ma opcji niestandardowych.

Kształt można wyeksportować w dowolnym formacie obrazu określonym w wyliczeniu SaveFormat. Na przykład obraz może być renderowany jako obraz rastrowy, na przykład JPEG, określając wyliczenie SaveFormat.Jpeg, lub jako obraz wektorowy, na przykład EMF, określając SaveFormat.Emf.

Poniższy przykład kodu ilustruje renderowanie kształtu do obrazu EMF oddzielnie od dokumentu i zapisywanie na dysku:

Poniższy przykład kodu ilustruje renderowanie kształtu do obrazu JPEG oddzielnie od dokumentu i zapisywanie w strumieniu:

Klasa ImageSaveOptions umożliwia określenie różnych opcji kontrolujących sposób renderowania obrazu. Funkcjonalność opisaną powyżej można zastosować w ten sam sposób do węzłów GroupShape i Shape.

Renderowanie do obiektu graficznego .NET

Renderowanie bezpośrednio do obiektu Graphics umożliwia zdefiniowanie własnych ustawień i stanu obiektu Graphics. Typowy scenariusz polega na renderowaniu kształtu bezpośrednio do obiektu Graphics pobranego z formularza Windows lub mapy bitowej. Po wyrenderowaniu węzła Shape ustawienia wpłyną na wygląd kształtu. Na przykład można obracać lub skalować kształt za pomocą metod RotateTransform LUB ScaleTransform dla obiektu Graphics.

Poniższy przykład pokazuje, jak renderować kształt do .NET Graphics obiekt oddzielnie od dokumentu i zastosuj obrót do renderowanego obrazu:

Podobnie jak w przypadku metody RenderToSize, metoda RenderToSize odziedziczona po NodeRendererBase jest przydatna do tworzenia miniatur zawartości dokumentu. Rozmiar kształtu jest określany przez konstruktora. Metoda RenderToSize akceptuje obiekt Graphics, współrzędne X i Y pozycji obrazu oraz Rozmiar obrazu (szerokość i wysokość), który zostanie narysowany na obiekcie Graphics.

Shape można renderować do określonej skali przy użyciu metody ShapeRenderer.RenderToScale odziedziczonej z klasy NodeRendererBase. Jest to podobne do metody Document.RenderToScale, która akceptuje te same główne parametry. Różnica między tymi dwiema metodami polega na tym, że w metodzie ShapeRenderer.RenderToScale zamiast rozmiaru dosłownego wybierasz wartość zmiennoprzecinkową, która skaluje kształt podczas jego renderowania. Jeśli wartość zmiennoprzecinkowa jest równa 1.0 powoduje, że kształt jest renderowany w 100% jego pierwotnego rozmiaru. Wartość zmiennoprzecinkowa 0.5 zmniejszy rozmiar obrazu o połowę.

Renderowanie obrazu kształtu

Klasa Shape reprezentuje obiekty w warstwie rysunku, takie jak AutoShape, pole tekstowe, dowolny kształt, OLE obiekt, formant ActiveX lub obraz. Za pomocą klasy Shape można tworzyć lub modyfikować kształty w dokumencie Microsoft Word. Ważną właściwością kształtu jest jego ShapeType. Kształty różnych typów mogą mieć różne możliwości w dokumencie Word. Na przykład tylko obrazy i kształty OLE mogą zawierać obrazy, podczas gdy większość kształtów może zawierać tylko tekst.

Poniższy przykład pokazuje, jak renderować obraz kształtu do obrazu JPEG oddzielnie od dokumentu i zapisywać go na dysku:

Pobieranie rozmiaru kształtu

Klasa ShapeRenderer zapewnia również funkcję pobierania rozmiaru kształtu w pikselach za pomocą metody GetSizeInPixels. Ta metoda akceptuje dwa parametry typu float (pojedyncze) – skalę i DPI, które są używane do obliczania rozmiaru kształtu, gdy kształt jest renderowany. Metoda zwraca obiekt Size, który zawiera szerokość i wysokość obliczonego rozmiaru. Jest to przydatne, gdy wymagana jest wcześniejsza znajomość rozmiaru renderowanego kształtu, na przykład podczas tworzenia nowej mapy bitowej z renderowanego wyjścia.

Poniższy przykład pokazuje, jak utworzyć nowy obiekt bitmapy i Grafiki o szerokości i wysokości renderowanego kształtu:

Podczas korzystania z metod RenderToSize lub RenderToScale, renderowany Rozmiar obrazu jest również zwracany w obiekcie SizeF. Można to przypisać do zmiennej i użyć w razie potrzeby.

Właściwość SizeInPoints zwraca rozmiar kształtu mierzony w punktach (patrz ShapeRenderer. Wynikiem jest obiekt SizeF zawierający szerokość i wysokość.