Redarea Formelor separat de un Document
Când procesăm documente, o sarcină comună este să extragem toate imaginile găsite în document și să le exportăm într-o locație externă. Această sarcină devine simplă cu Aspose.Words API, care oferă deja funcționalitatea pentru extragerea și salvarea datelor imaginii. “Cu toate acestea, uneori veți dori să extrageți alte tipuri de conținut grafic reprezentat de un tip diferit de obiect desenat, de exemplu o cutie de text care conține paragrafe, forme de săgeată și o mică imagine.” Nu există un mod simplu de a redarea acestui obiect, deoarece este o combinație de elemente de conținut individuale. De asemenea, puteți întâlni un caz în care conținutul este grupat împreună într-un obiect care arată ca o singură imagine.
Aspose.Words oferă funcționalitate pentru extragerea acestui tip de conținut în același mod în care puteți extrage o imagine simplă dintr-o formă ca conținut redat. Acest articol descrie cum se utilizează această funcționalitate pentru a redarea formele independente de document.
Tipuri de forme în Aspose.Words
Toate conținuturile dintr-un strat de document sunt reprezentate de nodul Shape sau GroupShape în modulul obiect document Aspose.Words (DOM). Aceste conținuturi pot fi cutii de text, imagini, AutoShape-uri, obiecte OLE, etc. Câțiva câmpuri sunt importate de asemenea ca forme, pentru exemplu, câmpul INCLUDEPICTURE
.
O imagine simplă este reprezentată de un nod Shape cu o dimensiune ShapeType.Image. Acest nod de formă nu are nici un nod copil dar datele imaginii conținute în acest nod de formă pot fi accesate prin proprietatea Shape.ImageData. Pe de altă parte, o formă poate fi, de asemenea, formată din mai multe noduri copil. De exemplu, o formă de casetă de text, care este reprezentată de proprietatea ShapeType.TextBox, poate fi alcătuită din multe noduri, cum ar fi Paragraph și Table. Cele mai multe forme pot include nodurile Paragraph și Table de nivel bloc. Aceste sunt aceleași noduri ca cele care apar în corpul principal. Formele sunt întotdeauna părți ale unui paragraf, fie incluse direct în linie sau ancorate la Paragraf, dar “plutind” oriunde pe pagina documentului.
Un document poate conține și forme care sunt grupate împreună. Grouping poate fi activat în Microsoft Word selectând mai multe obiecte și făcând click pe “Group” în meniul contextual din dreapta.
În Aspose.Words, aceste grupuri de forme sunt reprezentate de nodul GroupShape. Acestea pot fi de asemenea invocate în același mod pentru a redarea întregii grupuri la imagine.
Formatul DOCX poate conţine tipuri speciale de imagini, cum ar fi diagrame sau hărţi. Aceste forme sunt reprezentate și prin nodul Shape în Aspose.Words, care oferă o metodă asemănătoare pentru redarea lor ca imagini. Prin proiectare, o formă nu poate conține o altă formă ca copil, cu excepția cazului în care acea formă este o imagine ShapeType.Image. De exemplu Microsoft Word nu vă permite să introduceți o casetă de text în interiorul unei alte casete de text.
Tipurile de forme descrise mai sus oferă o metodă specială pentru redarea formelor prin intermediul clasei ShapeRenderer. O instanță a clasei ShapeRenderer este recuperată pentru o Shape sau GroupShape prin metoda GetShapeRenderer sau trecând Shape constructorului clasei ShapeRenderer. Această clasă oferă acces la membri care permit redarea unei forme către următoarele:
- Fișier pe disc folosind metoda Save suprascrisă
- Stream folosind metoda Save supraîncărcată “- .NET Grafică obiect utilizând RenderToSize și RenderToScale metode”
Randare în fişier sau flux
Metoda Save oferă suprascrieri care redau o formă direct într-un fișier sau într-un flux. Ambele suprascrieri acceptă o instanță a clasei ImageSaveOptions, ceea ce permite definirea opțiunilor pentru redarea formei. Acest lucru funcționează în același mod ca metoda Document.Save. “În ciuda faptului că acest parametru este necesar, puteți transmite o valoare nulă, specificând că nu există opțiuni personalizate.”
Formatul poate fi exportat în orice format de imagine specificat în enumerarea SaveFormat. De exemplu, imaginea poate fi redată ca o imagine raster, cum ar fi JPEG prin specificarea enumerării SaveFormat.Jpeg, sau ca o imagine vectorială, cum ar fi EMF prin specificarea enumerării SaveFormat.Emf.
Exemplul de cod de mai jos ilustrează redarea unei forme într-o imagine EMF separat de document și salvarea pe disc:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
ShapeRenderer render = shape.GetShapeRenderer(); | |
ImageSaveOptions imageOptions = new ImageSaveOptions(SaveFormat.Emf) | |
{ | |
Scale = 1.5f | |
}; | |
render.Save(ArtifactsDir + "RenderShape.RenderShapeAsEmf.emf", imageOptions); |
Exemplul de cod de mai jos ilustrează redarea unei forme într-o imagine JPEG separat de document și salvarea într-un flux:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
ShapeRenderer render = new ShapeRenderer(shape); | |
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 | |
}; | |
using (FileStream stream = new FileStream(ArtifactsDir + "RenderShape.RenderShapeAsJpeg.jpg", FileMode.Create)) | |
{ | |
render.Save(stream, imageOptions); | |
} |
Clasa ImageSaveOptions vă permite să specificați o varietate de opțiuni care controlează modul în care este redat imaginea. “Funcționalitatea descrisă mai sus poate fi aplicată în același mod la nodurile GroupShape și Shape.”
Redarea către un obiect grafic .NET
Redarea directă către un Graphics obiect permite să definești propriile setări și starea pentru obiectul Graphics. Un scenariu comun implică redarea unui model direct într-un Graphics obiect recuperat dintr-o Windows Formă sau o imagine. Când nodul Shape este redat, setările vor afecta aspectul formei. De exemplu, puteți roti sau scala forma utilizând metodele RotateTransform sau ScaleTransform pentru obiectul Graphics.
Exemplul de mai jos arată cum se poate randarea unei forme pentru un obiect NET Graphics separat de document și aplicarea rotației imaginii randate:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
public void RenderShapeToGraphics() | |
{ | |
Document doc = new Document(MyDir + "Rendering.docx"); | |
Shape shape = (Shape) doc.GetChild(NodeType.Shape, 0, true); | |
ShapeRenderer render = shape.GetShapeRenderer(); | |
// Find the size that the shape will be rendered to at the specified scale and resolution. | |
Size shapeSizeInPixels = render.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 rendered shape. | |
// In our case we will rotate the rendered shape. | |
using (Graphics graphics = Graphics.FromImage(image)) | |
{ | |
// Clear the shape with the background color of the document. | |
graphics.Clear(shape.Document.PageColor); | |
// Center the rotation using the translation method below. | |
graphics.TranslateTransform((float) image.Width / 8, (float) image.Height / 2); | |
// Rotate the image by 45 degrees. | |
graphics.RotateTransform(45); | |
// Undo the translation. | |
graphics.TranslateTransform(-(float) image.Width / 8, -(float) image.Height / 2); | |
// Render the shape onto the graphics object. | |
render.RenderToSize(graphics, 0, 0, shapeSizeInPixels.Width, shapeSizeInPixels.Height); | |
} | |
image.Save(ArtifactsDir + "RenderShape.RenderShapeToGraphics.png", ImageFormat.Png); | |
} | |
} |
Similar ca și metoda RenderToSize, metoda RenderToSize moștenită de la NodeRendererBase este utilă pentru crearea de imagini miniatură ale conținutului unui document. Forma dimensiunii este specificată prin constructor. Metoda RenderToSize acceptă obiectul Graphics, coordonatele X și Y ale poziției imaginii, precum și dimensiunea imaginii (lățime și înălțime) care va fi desenată pe obiectul Graphics.
The Shape poate fi redat la o anumită scalare folosind metoda ShapeRenderer.RenderToScale moștenită din clasa NodeRendererBase. Acest lucru este asemănător metodei Document.RenderToScale care acceptă aceleași parametri principali. Diferența dintre aceste două metode este că cu metoda ShapeRenderer.RenderToScale, în loc de o dimensiune literală, alegi o valoare float care scală forma în timpul redării. Dacă valoarea float este egală cu 1.0, aceasta determină ca forma să fie redată la 100% din dimensiunea sa inițială. O valoare a plutitoarei de 0.5 va micșora imaginea la jumătate.
Crearea unei imagini de formă
Clasa Shape reprezintă obiecte în stratul de desenare, cum ar fi un obiect Autodesen, o casetă de text, un obiect liber, un obiect OLE, un control ActiveX sau o imagine. Folosind clasa Shape, poţi crea sau modifica forme într-un Microsoft Word document. O proprietate importantă a unei forme este " ShapeType “. Formele de diferite tipuri pot avea capacități diferite într-un document Word. De exemplu, doar formele imaginilor și OLE pot avea imagini în interiorul lor, în timp ce majoritatea formelor pot avea doar text.
Exemplul următor arată cum să redăm o imagine “Shape” într-un fișier “JPEG”, separat de document și să îl salvăm pe disc:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
shape.GetShapeRenderer().Save(ArtifactsDir + "RenderShape.RenderShapeImage.jpg", new ImageSaveOptions(SaveFormat.Jpeg)); |
Recuperare dimensiune formă
Clasa ShapeRenderer oferă, de asemenea, funcționalitate pentru a obține dimensiunea formei în pixeli prin metoda GetSizeInPixels. Acest metod acceptă două parametri de tip float (Single) – scara și DPI, care sunt folosite în calcularea dimensiunii formei atunci când forma este redată. Metoda returnează obiectul Size, care conține lățimea și înălțimea mărimii calculate. Aceasta este utilă atunci când se solicită să se cunoască dimensiunea formei redat înainte de timp, de exemplu atunci când creați un nou bitmap din ieșirea redată.
Exemplul de mai jos arată cum să creăm un nou obiect Bitmap și Graphics cu lățimea și înălțimea formei care urmează să fie redat:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET.git. | |
Size shapeRenderedSize = shape.GetShapeRenderer().GetSizeInPixels(1.0f, 96.0f); | |
using (Bitmap image = new Bitmap(shapeRenderedSize.Width, shapeRenderedSize.Height)) | |
{ | |
using (Graphics graphics = Graphics.FromImage(image)) | |
{ | |
// Render shape onto the graphics object using the RenderToScale | |
// or RenderToSize methods of ShapeRenderer class. | |
} | |
} |
Când folosești metodele RenderToSize sau RenderToScale, dimensiunea imaginii renderizate este și ea returnată în obiectul SizeF. Acesta poate fi atribuit unei variabile și utilizat dacă este necesar.
Proprietatea SizeInPoints returnează dimensiunea formei măsurată în puncte (a se vedea ShapeRenderer). “Rezultatul este un obiect SizeF
care conține lățimea și înălțimea.”