Kształty renderowania Oddzielnie od dokumentu

Podczas przetwarzania dokumentów wspólnym zadaniem jest wydobycie wszystkich obrazów znalezionych w dokumencie i wywiezienie ich do miejsca zewnętrznego. To zadanie staje się proste z Aspose.Words API, która już zapewnia funkcjonalność do pobierania i zapisywania danych obrazu. Jednak czasami można chcieć podobnie wyodrębnić inne rodzaje treści graficznych, które są reprezentowane przez inny typ obiektu rysowania, 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żna również napotkać przypadek, gdy zawartość została zgrupowana w obiekt, który wygląda jak jeden obraz.

Aspose.Words zapewnia funkcjonalność do ekstrakcji tego typu treści w ten sam sposób można pobrać prosty obraz z kształtu jako treści renderowanej. Ten artykuł opisuje, jak wykorzystać tę funkcjonalność do renderowania kształtów niezależnie od dokumentu.

Rodzaje kształtów Aspose.Words

Cała zawartość w warstwie rysunku dokumentu jest reprezentowana przez Shape lub GroupShape węzeł Aspose.Words Moduł obiektu dokumentu (DOM). Taka zawartość może być pola tekstowe, obrazy, autoShapes, obiekty OLE, itp. Niektóre pola są również importowane jako kształty, na przykład, INCLUDEPICTURE Pole.

Prosty obraz jest reprezentowany przez Shape węzeł ShapeType.Image. Ten węzeł kształtu nie ma węzłów dziecięcych, ale dane obrazu zawarte w węźle kształtu mogą być dostępne przez Shape.ImageData nieruchomości. Z drugiej strony, kształt może być również złożony z wielu węzłów dziecięcych. Na przykład, kształt pola tekstowego, który jest reprezentowany przez ShapeType.TextBox nieruchomości, może być złożony z wielu węzłów, takich jak Paragraph oraz Table. Większość kształtów może obejmować Paragraph oraz Table węzły poziomu blokady. Są to te same węzły, które pojawiają się w głównym ciele. Kształty są zawsze częściami niektórych punktów, albo zawarte bezpośrednio inline lub zakotwiczone do Ustęp ale “pływające” gdziekolwiek na stronie dokumentu.

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

Dokument może również zawierać kształty zgrupowane razem. Groupw Microsoft Word wybierając wiele obiektów i klikając “Group"w prawym menu.

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

W Aspose.Words, te grupy kształtów są reprezentowane przez GroupShape węzeł. Mogą one być również wywoływane w ten sam sposób, aby uczynić całą grupę do obrazu.

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

Format DOCX może zawierać specjalne typy obrazów, takie jak schematy lub wykresy. Kształty te są również reprezentowane przez Shape węzeł Aspose.Words, co również zapewnia podobną metodę renderowania ich jako obrazów. Kształt nie może zawierać innego kształtu jako dziecko, chyba że jest to obraz (ShapeType.Image). Na przykład: Microsoft Word nie pozwala na umieszczenie pola tekstowego w innym polu tekstowym.

Opisane powyżej typy kształtu stanowią specjalną metodę renderowania kształtów przez ShapeRenderer Klasa. Przykładem ShapeRenderer klasa jest pobierana dla Shape lub GroupShape przez GetShapeRenderer metody lub przez podanie Shape do konstruktora ShapeRenderer Klasa. Klasa ta zapewnia dostęp do członków, które umożliwiają nadanie kształtu:

  • Plik na dysku przy użyciu Save przeciążenie metody
  • Strumień przy użyciu Save przeciążenie metody
  • Grafika Obiekt za pomocą RenderToSize oraz RenderToScale metody

Renderowanie pliku lub strumienia

W Save metoda zapewnia przeciążenia, które renderują kształt bezpośrednio do pliku lub strumienia. Oba przeładunki akceptują przykład ImageSaveOptions klasa, która pozwala definiować opcje renderowania kształtu. Działa to tak samo jak Document.Save Metoda. Nawet jeśli ten parametr jest wymagany, możesz podać wartość null, określając, że nie ma własnych opcji.

Kształt może być eksportowany w dowolnym formacie obrazka określonym w SaveFormat wyliczenie. Na przykład, obraz może być renderowany jako obraz rastrowy, takie jak JPEG poprzez określenie SaveFormat.Jpeg wyliczenie, lub jako obraz wektorowy, takie jak EMF poprzez określenie SaveFormat.Emf.

Poniższy przykład kodu ilustruje nadanie kształtu obrazowi EMF oddzielnie od dokumentu i zapisywanie na dysku:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
ShapeRenderer r = shape.getShapeRenderer();
// Define custom options which control how the image is rendered. Render the
// shape to the JPEG raster format.
ImageSaveOptions imageOptions = new ImageSaveOptions(SaveFormat.EMF);
imageOptions.setScale(1.5f);
// Save the rendered image to disk.
r.save(dataDir + "TestFile.RenderToDisk_Out.emf", imageOptions);

Poniższy przykład kodu ilustruje nadanie kształtu obrazowi JPEG oddzielnie od dokumentu i zapisywanie do strumienia:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
ShapeRenderer r = new ShapeRenderer(shape);
// Define custom options which control how the image is rendered. Render the
// shape to the vector format EMF.
ImageSaveOptions imageOptions = new ImageSaveOptions(SaveFormat.JPEG);
// Output the image in gray scale
imageOptions.setImageColorMode(ImageColorMode.GRAYSCALE);
// Reduce the brightness a bit (default is 0.5f).
imageOptions.setImageBrightness(0.45f);
FileOutputStream stream = new FileOutputStream(dataDir + "TestFile.RenderToStream_Out.jpg");
// Save the rendered image to the stream using different options.
r.save(stream, imageOptions);

W ImageSaveOptions klasa pozwala na określenie różnych opcji, które kontrolują sposób renderowania obrazu. Opisaną powyżej funkcjonalność można zastosować w ten sam sposób do GroupShape oraz Shape węzły.

Wypożyczanie Graphics Obiekt

Renderowanie bezpośrednio do Graphics obiekt pozwala na zdefiniowanie własnych ustawień i stanu Graphics obiekt. Wspólny scenariusz zakłada przekształcenie kształtu bezpośrednio w Graphics obiekt odzyskany z Windows Forma albo Bitmap. Kiedy Shape węzeł jest renderowany, ustawienia będą miały wpływ na wygląd kształtu. Na przykład, można obracać lub skalować kształt za pomocą RotateTransform lub ScaleTransform metody Graphics obiekt.

Poniższy przykład pokazuje, jak zmienić kształt Graphics obiekt oddzielnie od dokumentu i zastosować rotację do renderowanego obrazu:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
// The shape renderer is retrieved using this method. This is made into a
// separate object from the shape as it internally
// caches the rendered shape.
ShapeRenderer r = shape.getShapeRenderer();
// Find the size that the shape will be rendered to at the specified scale and
// resolution.
Dimension 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.
int maxSide = Math.max(shapeSizeInPixels.width, shapeSizeInPixels.height);
BufferedImage image = new BufferedImage((int) (maxSide * 1.25), (int) (maxSide * 1.25),
BufferedImage.TYPE_INT_ARGB);
// 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.
Graphics2D gr = (Graphics2D) image.getGraphics();
// Clear the shape with the background color of the document.
gr.setBackground(shape.getDocument().getPageColor());
gr.clearRect(0, 0, image.getWidth(), image.getHeight());
// Center the rotation using translation method below
gr.translate(image.getWidth() / 8, image.getHeight() / 2);
// Rotate the image by 45 degrees.
gr.rotate(45 * Math.PI / 180);
// Undo the translation.
gr.translate(-image.getWidth() / 8, -image.getHeight() / 2);
// Render the shape onto the graphics object.
r.renderToSize(gr, 0, 0, shapeSizeInPixels.width, shapeSizeInPixels.height);
ImageIO.write(image, "png", new File(dataDir + "TestFile.RenderToGraphics_out.png"));
gr.dispose();

Podobnie RenderToSize metoda RenderToSizemetoda dziedziczona od NodeRendererBase jest przydatny do tworzenia miniatur zawartości dokumentu. Rozmiar kształtu jest określony za pośrednictwem konstruktora. W RenderToSize metoda akceptuje Graphics obiekt, współrzędne X i Y pozycji obrazu oraz rozmiar obrazu (szerokość i wysokość), który zostanie narysowany na obrazku Graphics obiekt.

W Shape może być renderowane do określonej skali za pomocą ShapeRenderer.RenderToScale metoda dziedziczona od NodeRendererBase Klasa. Jest to podobne do Document.RenderToScale metoda akceptująca te same główne parametry. Różnica pomiędzy tymi dwoma metodami jest taka, że z ShapeRenderer.RenderToScale metoda, zamiast dosłownego rozmiaru, wybrać zmienną wartość, która skaluje kształt podczas renderowania. Jeśli wartość float równa się 1.0 powoduje, że kształt jest renderowany przy 100% jego oryginalnego rozmiaru. Wartość zmienna 0,5 zmniejszy rozmiar obrazu o połowę.

Renderowanie obrazu kształtu

W Shape klasa reprezentuje obiekty w warstwie rysunku, takie jak autoShape, text box, freeform, OLE obiekt, ActiveX kontroli, lub obraz. Korzystanie z Shape klasy, można tworzyć lub modyfikować kształty w Microsoft Word dokument. 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ą mieć obrazy wewnątrz nich, podczas gdy większość kształtów może mieć tylko tekst.

Poniższy przykład pokazuje, jak wykonać obraz kształtu na obrazek JPEG oddzielnie od dokumentu i zapisać go na dysku:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
dataDir = dataDir + "TestFile.RenderShape_out.jpg";
// Save the Shape image to disk in JPEG format and using default options.
shape.getShapeRenderer().save(dataDir, null);

Pobieranie rozmiaru kształtu

W ShapeRenderer klasa zapewnia również funkcjonalność, aby odzyskać rozmiar kształtu w pikselach poprzez GetSizeInPixels Metoda. Metoda ta akceptuje dwa parametry float (Single) - skalę i DPI, które są wykorzystywane do obliczania wielkości kształtu, gdy kształt jest renderowany. Metoda zwraca Size obiekt, który zawiera szerokość i wysokość obliczonego rozmiaru. Jest to przydatne, gdy jest wymagane, aby znać rozmiar renderowanego kształtu z wyprzedzeniem, na przykład podczas tworzenia nowej mapy Bitmap z renderowanego wyjścia.

Poniższy przykład pokazuje jak stworzyć nowy obiekt Bitmap i Graphics o szerokości i wysokości renderowanego kształtu:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// For complete examples and data files, please go to
// https://github.com/aspose-words/Aspose.Words-for-Java
Point2D.Float shapeSizeInDocument = shape.getShapeRenderer().getSizeInPoints();
float width = shapeSizeInDocument.x; // The width of the shape.
float height = shapeSizeInDocument.y; // The height of the shape.
Dimension shapeRenderedSize = shape.getShapeRenderer().getSizeInPixels(1.0f, 96.0f);
BufferedImage image = new BufferedImage(shapeRenderedSize.width, shapeRenderedSize.height,
BufferedImage.TYPE_INT_RGB);
Graphics gr = image.getGraphics();
// Render shape onto the graphics object using the RenderToScale or RenderToSize
// methods of ShapeRenderer class.
gr.dispose();

Podczas stosowania RenderToSize lub RenderToScale metody, rozmiar renderowanego obrazu jest również zwracany w SizeF obiekt. Można to przypisać do zmiennej i w razie potrzeby wykorzystać.

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