Redarea formelor separat de un Document
La procesarea documentelor, o sarcină comună este de a extrage toate imaginile găsite în document și de a le exporta într-o locație externă. Această sarcină devine simplă cu Aspose.Words API, care oferă deja funcționalitatea pentru extragerea și salvarea datelor de imagine. Cu toate acestea, uneori poate doriți să extrageți în mod similar alte tipuri de conținut grafic care sunt reprezentate de un alt tip de obiect de desen, de exemplu, o casetă de text care conține paragrafe, forme de săgeți și o imagine mică. Nu există o modalitate simplă de redare a acestui obiect, deoarece este o combinație de elemente de conținut individuale. De asemenea, este posibil să întâlniți un caz în care conținutul a fost grupat împreună în obiectul 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ă din formă ca conținut redat. Acest articol descrie modul de utilizare a acestei funcționalități pentru a reda forme independent de document.
Tipuri de forme în Aspose.Words
Tot conținutul dintr-un strat de desen document este reprezentat de nodul Shape sau GroupShape din modulul obiect Document Aspose.Words (DOM). Astfel de conținuturi pot fi casete de text,imagini, AutoShapes, OLE obiecte etc. Unele câmpuri sunt, de asemenea, importate ca forme, de exemplu, câmpul INCLUDEPICTURE
.
O imagine simplă este reprezentată de un nod Shape de ShapeType.Image. Acest nod de formă nu are noduri copil, dar datele de imagine conținute în acest nod de formă pot fi accesate prin proprietatea Shape.ImageData. Pe de altă parte, o formă poate fi alcătuită și din multe noduri copil. De exemplu, o formă de casetă de text, care este reprezentată de proprietatea ShapeType.TextBox, poate fi alcătuită din mai multe noduri, cum ar fi Paragraph și Table. Majoritatea formelor pot include nodurile la nivel de bloc Paragraph și Table. Acestea 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, fie ancorate la Paragraph,, dar “plutitoare” oriunde în pagina documentului.
Un document poate conține, de asemenea, forme care sunt grupate împreună. Gruparea poate fi activată în Microsoft Word selectând mai multe obiecte și făcând clic pe “grup” în meniul cu clic 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 reda întregul grup imaginii.
Formatul DOCX poate conține tipuri speciale de imagini, cum ar fi diagrame sau diagrame. Aceste forme sunt, de asemenea, reprezentate prin nodul Shape din Aspose.Words, care oferă, de asemenea, o metodă similară pentru a le reda ca imagini. Prin design, 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ă inserați o casetă de text într-o altă casetă de text.
Tipurile de forme descrise mai sus oferă o metodă specială pentru a reda formele prin clasa ShapeRenderer. O instanță a clasei ShapeRenderer este recuperată pentru un Shape sau GroupShape prin metoda GetShapeRenderer sau prin trecerea Shape la constructorul clasei ShapeRenderer. Această clasă oferă acces la membri, care permit redarea unei forme la următoarele:
- Fișier pe disc folosind metoda Save suprasarcină
- Flux folosind metoda Save suprasarcină
- Obiect grafic utilizând metodele RenderToSize și RenderToScale
Redare în fișier sau flux
Metoda Save oferă supraîncărcări care redă o formă direct într-un fișier sau flux. Ambele supraîncărcări acceptă o instanță a clasei ImageSaveOptions, care permite definirea opțiunilor pentru redarea formei. Aceasta funcționează în același mod ca metoda Document.Save. Chiar dacă acest parametru este necesar, puteți trece o valoare nulă, specificând că nu există opțiuni personalizate.
Forma 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 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-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); |
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-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); |
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 nodurilor GroupShape și Shape.
Redarea la un obiect Graphics
Redarea directă la un obiect Graphics vă permite să definiți propriile setări și starea obiectului Graphics. Un scenariu comun implică redarea unei forme direct într-un obiect Graphics recuperat dintr-o formă Windows sau o hartă de biți. 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 să redați o formă unui obiect Graphics separat de document și să aplicați rotația imaginii redate:
// 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(); |
În mod similar, pentru metoda RenderToSize, Metoda RenderToSize moștenită de la NodeRendererBase este utilă pentru crearea de miniaturi ale conținutului documentului. Dimensiunea formei este specificată prin constructor. Metoda RenderToSize acceptă obiectul Graphics, coordonatele X și Y ale poziției imaginii și dimensiunea imaginii (lățime și înălțime) care va fi desenată pe obiectul Graphics.
Shape poate fi redat la o anumită scară folosind metoda ShapeRenderer.RenderToScale moștenită din clasa NodeRendererBase. Aceasta este similară cu metoda Document.RenderToScale care acceptă aceiași parametri majori. Diferența dintre aceste două metode este că, cu metoda ShapeRenderer.RenderToScale, în loc de o dimensiune literală, alegeți o valoare float care scalează forma în timpul redării sale. Dacă valoarea float este egală cu 1.0 determină ca forma să fie redată la 100% din dimensiunea inițială. O valoare float de 0.5 va reduce dimensiunea imaginii la jumătate.
Redarea unei imagini de formă
Clasa Shape reprezintă obiecte din stratul de desen, cum ar fi un AutoShape, o casetă de text, o formă liberă, un obiect OLE, un control ActiveX sau o imagine. Folosind clasa Shape, puteți crea sau modifica forme într-un document Microsoft Word. O proprietate importantă a unei forme este ShapeType. Formele de diferite tipuri pot avea capacități diferite într-un document Word. De exemplu, numai imaginile și formele OLE pot avea imagini în interiorul lor, în timp ce majoritatea formelor pot avea doar text.
Următorul exemplu arată cum să redați o imagine de formă într-o imagine JPEG separat de document și să o salvați pe disc:
// 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); |
Preluarea unei dimensiuni de formă
Clasa ShapeRenderer oferă, de asemenea, funcționalitate pentru a prelua dimensiunea formei în pixeli prin metoda GetSizeInPixels. Această metodă acceptă doi parametri plutitori (unici) - scara și DPI, care sunt utilizați la calcularea dimensiunii formei atunci când forma este redată. Metoda returnează obiectul Size, care conține lățimea și înălțimea dimensiunii calculate. Acest lucru este util atunci când este necesar să cunoașteți dimensiunea formei redate în avans, de exemplu atunci când creați o nouă hartă de biți din ieșirea redată.
Exemplul de mai jos arată cum să creați un nou obiect Bitmap și grafic 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-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(); |
Când se utilizează metodele RenderToSize sau RenderToScale, dimensiunea imaginii redate este returnată și în obiectul SizeF. Aceasta poate fi atribuită unei variabile și utilizată dacă este necesar.
Proprietatea SizeInPoints returnează dimensiunea formei măsurată în puncte (vezi ShapeRenderer). Rezultatul este un obiect SizeF
care conține lățimea și înălțimea.