Formen getrennt von einem Dokument rendern
Bei der Verarbeitung von Dokumenten besteht eine häufige Aufgabe darin, alle im Dokument gefundenen Bilder zu extrahieren und an einen externen Speicherort zu exportieren. Diese Aufgabe wird mit Aspose.Words API vereinfacht, das bereits über die Funktionalität zum Extrahieren und Speichern von Bilddaten verfügt. Manchmal möchten Sie jedoch möglicherweise auch andere Arten von Grafikinhalten extrahieren, die durch einen anderen Zeichenobjekttyp dargestellt werden, beispielsweise ein Textfeld mit Absätzen, Pfeilformen und einem kleinen Bild. Es gibt keine einfache Möglichkeit, dieses Objekt darzustellen, da es sich um eine Kombination einzelner Inhaltselemente handelt. Es kann auch vorkommen, dass die Inhalte zu einem Objekt gruppiert wurden, das wie ein einzelnes Bild aussieht.
Aspose.Words bietet Funktionen zum Extrahieren dieser Art von Inhalten, genauso wie Sie ein einfaches Bild aus einer Form als gerenderten Inhalt extrahieren können. In diesem Artikel wird beschrieben, wie Sie diese Funktionalität nutzen, um Formen unabhängig vom Dokument zu rendern.
Formtypen in Aspose.Words
Der gesamte Inhalt einer Dokumentzeichnungsebene wird durch den Shape- oder GroupShape-Knoten im Aspose.Words Document Object Module (DOM) dargestellt. Solche Inhalte können Textfelder, Bilder, AutoShapes, OLE-Objekte usw. sein. Einige Felder werden auch als Formen importiert, beispielsweise das INCLUDEPICTURE
-Feld.
Ein einfaches Bild wird durch einen Shape-Knoten von ShapeType.Image dargestellt. Dieser Formknoten hat keine untergeordneten Knoten, aber auf die in diesem Formknoten enthaltenen Bilddaten kann über die Shape.ImageData-Eigenschaft zugegriffen werden. Andererseits kann eine Form auch aus vielen untergeordneten Knoten bestehen. Beispielsweise kann eine Textfeldform, die durch die ShapeType.TextBox-Eigenschaft dargestellt wird, aus vielen Knoten wie Paragraph und Table bestehen. Die meisten Formen können die Paragraph- und Table-Blockebenenknoten enthalten. Dabei handelt es sich um dieselben Knoten wie im Hauptteil. Formen sind immer Teile eines Absatzes, entweder direkt inline eingebunden oder im Absatz, verankert, aber an einer beliebigen Stelle auf der Dokumentseite “schwebend”.
Ein Dokument kann auch Formen enthalten, die gruppiert sind. Grouping kann in Microsoft Word aktiviert werden, indem Sie mehrere Objekte auswählen und im Kontextmenü auf “Group” klicken.
In Aspose.Words werden diese Formengruppen durch den GroupShape-Knoten dargestellt. Diese können auch auf die gleiche Weise aufgerufen werden, um die gesamte Gruppe als Bild darzustellen.
Das DOCX-Format kann spezielle Bildtypen wie Diagramme oder Diagramme enthalten. Diese Formen werden auch durch den Shape-Knoten in Aspose.Words dargestellt, der auch eine ähnliche Methode zum Rendern als Bilder bietet. Eine Form kann konstruktionsbedingt keine andere Form als Kind enthalten, es sei denn, diese Form ist ein Bild (ShapeType.Image). Mit Microsoft Word ist es beispielsweise nicht möglich, ein Textfeld in ein anderes Textfeld einzufügen.
Die oben beschriebenen Formtypen bieten eine spezielle Methode zum Rendern der Formen über die ShapeRenderer-Klasse. Eine Instanz der ShapeRenderer-Klasse wird für ein Shape oder GroupShape über die GetShapeRenderer-Methode oder durch Übergabe des Shape an den Konstruktor der ShapeRenderer-Klasse abgerufen. Diese Klasse bietet Zugriff auf Mitglieder, die das Rendern einer Form wie folgt ermöglichen:
- Datei auf der Festplatte mit der Save-Methodenüberladung
- Streamen Sie mit der Save-Methodenüberladung
- .NET-Grafikobjekt unter Verwendung der RenderToSize- und RenderToScale-Methoden
Rendern in Datei oder Stream
Die Save-Methode stellt Überladungen bereit, die eine Form direkt in eine Datei oder einen Stream rendern. Beide Überladungen akzeptieren eine Instanz der ImageSaveOptions-Klasse, die es ermöglicht, Optionen zum Rendern der Form zu definieren. Dies funktioniert auf die gleiche Weise wie die Document.Save-Methode. Auch wenn dieser Parameter erforderlich ist, können Sie einen Nullwert übergeben und damit angeben, dass keine benutzerdefinierten Optionen vorhanden sind.
Die Form kann in jedes in der SaveFormat-Enumeration angegebene Bildformat exportiert werden. Beispielsweise kann das Bild durch Angabe der SaveFormat.Jpeg-Enumeration als Rasterbild wie JPEG oder durch Angabe von SaveFormat.Emf als Vektorbild wie EMF gerendert werden.
Das folgende Codebeispiel veranschaulicht das Rendern einer Form in ein EMF-Bild getrennt vom Dokument und das Speichern auf der Festplatte:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
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) | |
{ | |
Scale = 1.5f | |
}; | |
dataDir = dataDir + "TestFile.RenderToDisk_out.emf"; | |
// Save the rendered image to disk. | |
r.Save(dataDir, imageOptions); |
Das folgende Codebeispiel veranschaulicht das Rendern einer Form in ein JPEG-Bild getrennt vom Dokument und das Speichern in einem Stream:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
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 | |
ImageColorMode = ImageColorMode.Grayscale, | |
// Reduce the brightness a bit (default is 0.5f). | |
ImageBrightness = 0.45f | |
}; | |
dataDir = dataDir + "TestFile.RenderToStream_out.jpg"; | |
FileStream stream = new FileStream(dataDir, FileMode.Create); | |
// Save the rendered image to the stream using different options. | |
r.Save(stream, imageOptions); |
Mit der ImageSaveOptions-Klasse können Sie verschiedene Optionen angeben, die steuern, wie das Bild gerendert wird. Die oben beschriebene Funktionalität kann auf die gleiche Weise auf die GroupShape- und Shape-Knoten angewendet werden.
Rendern in ein .NET-Grafikobjekt
Durch direktes Rendern in ein Graphics-Objekt können Sie Ihre eigenen Einstellungen und den Status für das Graphics-Objekt definieren. Ein häufiges Szenario besteht darin, eine Form direkt in ein Graphics-Objekt zu rendern, das aus einem Windows-Formular oder einer Bitmap abgerufen wird. Wenn der Shape-Knoten gerendert wird, wirken sich die Einstellungen auf das Erscheinungsbild der Form aus. Beispielsweise können Sie die Form drehen oder skalieren, indem Sie die RotateTransform- oder ScaleTransform-Methoden für das Graphics-Objekt verwenden.
Das folgende Beispiel zeigt, wie Sie eine Form getrennt vom Dokument in ein .NET Graphics-Objekt rendern und eine Drehung auf das gerenderte Bild anwenden:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
public static void RenderShapeToGraphics(string dataDir, Shape shape) | |
{ | |
ShapeRenderer r = shape.GetShapeRenderer(); | |
// Find the size that the shape will be rendered to at the specified scale and resolution. | |
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. | |
int maxSide = System.Math.Max(shapeSizeInPixels.Width, shapeSizeInPixels.Height); | |
using (Bitmap image = new Bitmap((int)(maxSide * 1.25), (int)(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. | |
using (Graphics gr = Graphics.FromImage(image)) | |
{ | |
// Clear the shape with the background color of the document. | |
gr.Clear(shape.Document.PageColor); | |
// Center the rotation using translation method below | |
gr.TranslateTransform((float)image.Width / 8, (float)image.Height / 2); | |
// Rotate the image by 45 degrees. | |
gr.RotateTransform(45); | |
// Undo the translation. | |
gr.TranslateTransform(-(float)image.Width / 8, -(float)image.Height / 2); | |
// Render the shape onto the graphics object. | |
r.RenderToSize(gr, 0, 0, shapeSizeInPixels.Width, shapeSizeInPixels.Height); | |
} | |
dataDir = dataDir + "TestFile.RenderToGraphics_out.png"; | |
image.Save(dataDir, ImageFormat.Png); | |
Console.WriteLine("\nShape rendered to graphics successfully.\nFile saved at " + dataDir); | |
} | |
} |
Ähnlich wie die RenderToSize-Methode ist die aus NodeRendererBase geerbte RenderToSize-Methode nützlich zum Erstellen von Miniaturansichten eines Dokumentinhalts. Die Formgröße wird über den Konstruktor angegeben. Die RenderToSize-Methode akzeptiert das Graphics-Objekt, die X- und Y-Koordinaten der Bildposition und die Größe des Bildes (Breite und Höhe), das auf das Graphics-Objekt gezeichnet wird.
Das Shape kann mit der von der NodeRendererBase-Klasse geerbten ShapeRenderer.RenderToScale-Methode in einem bestimmten Maßstab gerendert werden. Dies ähnelt der Document.RenderToScale-Methode, die dieselben Hauptparameter akzeptiert. Der Unterschied zwischen diesen beiden Methoden besteht darin, dass Sie bei der ShapeRenderer.RenderToScale-Methode anstelle einer Literalgröße einen Float-Wert wählen, der die Form während des Renderns skaliert. Wenn der Float-Wert gleich 1,0 ist, wird die Form mit 100 % ihrer ursprünglichen Größe gerendert. Ein Float-Wert von 0,5 reduziert die Bildgröße um die Hälfte.
Rendern eines Formbildes
Die Shape-Klasse stellt Objekte in der Zeichenebene dar, beispielsweise eine AutoForm, ein Textfeld, eine Freiform, ein OLE-Objekt, ein ActiveX-Steuerelement oder ein Bild. Mithilfe der Shape-Klasse können Sie Formen in einem Microsoft Word-Dokument erstellen oder ändern. Eine wichtige Eigenschaft einer Form ist ihr ShapeType. Formen unterschiedlichen Typs können in einem Word-Dokument unterschiedliche Funktionen haben. Beispielsweise können nur Bild- und OLE-Formen Bilder enthalten, während die meisten Formen nur Text enthalten können.
Das folgende Beispiel zeigt, wie Sie ein Shape-Bild getrennt vom Dokument in ein JPEG-Bild rendern und auf der Festplatte speichern:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
dataDir = dataDir + "TestFile.RenderShape_out.jpg"; | |
// Save the Shape image to disk in JPEG format and using default options. | |
shape.GetShapeRenderer().Save(dataDir, null); |
Abrufen einer Formgröße
Die ShapeRenderer-Klasse bietet auch Funktionen zum Abrufen der Größe der Form in Pixeln über die GetSizeInPixels-Methode. Diese Methode akzeptiert zwei Float-Parameter (Einzelparameter): Skalierung und DPI, die bei der Berechnung der Formgröße beim Rendern der Form verwendet werden. Die Methode gibt das Size-Objekt zurück, das die Breite und Höhe der berechneten Größe enthält. Dies ist nützlich, wenn die Größe der gerenderten Form im Voraus bekannt sein muss, beispielsweise beim Erstellen einer neuen Bitmap aus der gerenderten Ausgabe.
Das folgende Beispiel zeigt, wie ein neues Bitmap- und Grafikobjekt mit der Breite und Höhe der zu rendernden Form erstellt wird:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
Size shapeRenderedSize = shape.GetShapeRenderer().GetSizeInPixels(1.0f, 96.0f); | |
using (Bitmap image = new Bitmap(shapeRenderedSize.Width, shapeRenderedSize.Height)) | |
{ | |
using (Graphics g = Graphics.FromImage(image)) | |
{ | |
// Render shape onto the graphics object using the RenderToScale or RenderToSize methods of ShapeRenderer class. | |
} | |
} |
Bei Verwendung der Methoden RenderToSize oder RenderToScale wird auch die Größe des gerenderten Bildes im SizeF-Objekt zurückgegeben. Dieser kann einer Variablen zugewiesen und bei Bedarf verwendet werden.
Die SizeInPoints-Eigenschaft gibt die in Punkten gemessene Formgröße zurück (siehe ShapeRenderer). Das Ergebnis ist ein SizeF
-Objekt, das die Breite und Höhe enthält.