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 funkcjonalność wyodrębniania i zapisywania danych obrazu. Czasami jednak może zaistnieć potrzeba wyodrębnienia w podobny sposób innych typów treści graficznych reprezentowanych przez inny typ obiektu rysunkowego, 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 kombinacja poszczególnych elementów treści. Możesz także spotkać się z przypadkiem, 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ą treść. 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). Taka zawartość może obejmować pola tekstowe, obrazy, autokształty, obiekty OLE itp. Niektóre pola są również importowane w postaci kształtów, np. pole INCLUDEPICTURE.

Prosty obraz jest reprezentowany przez węzeł Shape ShapeType.IMAGE. Ten węzeł kształtu nie ma węzłów podrzędnych, ale dostęp do danych obrazu zawartych w tym węźle kształtu można uzyskać za pomocą właściwości Shape.image_data. Z drugiej strony kształt może składać się z wielu węzłów podrzędnych. Na przykład kształt pola tekstowego reprezentowany przez właściwość ShapeType.TEXT_BOX 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 korpusie głównym. Kształty są zawsze częścią jakiegoś akapitu, umieszczoną bezpośrednio w wierszu lub zakotwiczoną w Paragraph, ale “pływającą” w dowolnym miejscu strony dokumentu.

rendering-shapes-separately-from-a-document_1

Dokument może również zawierać zgrupowane kształty. Grouping można włączyć w Microsoft Word, zaznaczając wiele obiektów i klikając “Group” w menu wyświetlanym po kliknięciu prawym przyciskiem myszy.

rendering-shapes-separately-from-a-document_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 wyrenderować całą grupę na obraz.

rendering-shapes-separately-from-a-document_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 formacie Aspose.Words, który również zapewnia podobną metodę renderowania ich jako obrazów. Z założenia kształt nie może zawierać innego kształtu jako elementu podrzędnego, chyba że ten kształt jest obrazem (ShapeType.IMAGE). Na przykład Microsoft Word nie pozwala na wstawienie pola tekstowego do innego pola tekstowego.

Opisane powyżej typy kształtów zapewniają specjalną metodę renderowania kształtów za pomocą klasy ShapeRenderer. Instancja klasy ShapeRenderer jest pobierana dla formatu Shape lub GroupShape za pomocą metody get_shape_renderer lub poprzez przekazanie Shape do konstruktora klasy ShapeRenderer. Ta klasa zapewnia dostęp do elementów, które umożliwiają renderowanie kształtu do następujących elementów:

  • Plik na dysku
  • Strumień

Renderowanie do pliku lub strumienia

Metoda save zapewnia przeciążenia, które renderują kształt bezpośrednio do pliku lub strumienia. Obydwa przeciążenia akceptują instancję klasy ImageSaveOptions, która pozwala zdefiniować opcje renderowania kształtu. Działa to w taki sam sposób, jak metoda Document.save. Mimo że ten parametr jest wymagany, można przekazać wartość null, określając, że nie ma żadnych 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, taki jak JPEG, określając wyliczenie SaveFormat.JPEG, lub jako obraz wektorowy, taki jak EMF, określając SaveFormat.EMF.

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

r = shape.get_shape_renderer()

# Define custom options which control how the image is rendered. Render the shape to the JPEG raster format.
imageOptions = aw.saving.ImageSaveOptions(aw.SaveFormat.EMF)
imageOptions.scale = 1.5
        
# Save the rendered image to disk.
r.save(docs_base.artifacts_dir + "TestFile.RenderToDisk_out.emf", imageOptions)

Poniższy przykład kodu ilustruje renderowanie kształtu do obrazu JPEG niezależnie od dokumentu i zapisywanie do strumienia:

r = shape.get_shape_renderer()

# Define custom options which control how the image is rendered. Render the shape to the vector format EMF.
imageOptions = aw.saving.ImageSaveOptions(aw.SaveFormat.JPEG)
        
# Output the image in gray scale
imageOptions.image_color_mode = aw.saving.ImageColorMode.GRAYSCALE

# Reduce the brightness a bit (default is 0.5f).
imageOptions.image_brightness = 0.45
        
stream =  io.FileIO(docs_base.artifacts_dir + "TestFile.RenderToStream_out.jpg", "w+b")

# Save the rendered image to the stream using different options.
r.save(stream, imageOptions)

# Close the stream
stream.close()

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

Renderowanie obrazu kształtu

Klasa Shape reprezentuje obiekty w warstwie rysunku, takie jak Autokształt, pole tekstowe, dowolny kształt, obiekt OLE, formant ActiveX lub obraz. Korzystając z klasy Shape, możesz tworzyć lub modyfikować kształty w dokumencie Microsoft Word. Ważną właściwością kształtu jest jego format shape_type. Kształty różnych typów mogą mieć różne możliwości w dokumencie programu 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 wyrenderować obraz Shape do obrazu JPEG niezależnie od dokumentu i zapisać go na dysku:

# Save the rendered image to disk.
shape.get_shape_renderer().save(docs_base.artifacts_dir + "TestFile.RenderShapeImage.jpeg", None)

Pobieranie rozmiaru kształtu

Klasa ShapeRenderer zapewnia również funkcję pobierania rozmiaru kształtu w pikselach za pomocą metody get_size_in_pixels. Ta metoda akceptuje dwa parametry float (Single) – skalę i DPI, które są używane do obliczania rozmiaru kształtu podczas renderowania kształtu. Metoda zwraca obiekt Size, który zawiera szerokość i wysokość obliczonego rozmiaru. Jest to przydatne, gdy wymagane jest wcześniejsze poznanie rozmiaru renderowanego kształtu. Właściwość size_in_points zwraca rozmiar kształtu mierzony w punktach. Wynikiem jest obiekt SizeF zawierający szerokość i wysokość. Możesz także użyć właściwości bounds_in_points, aby uzyskać rzeczywiste granice kształtu.