Lavorare con le immagini

Aspose.Words consente agli utenti di lavorare con le immagini in modo molto flessibile. In questo articolo, puoi esplorare solo alcune delle possibilità di lavorare con le immagini.

Come estrarre immagini da un documento

Tutte le immagini sono memorizzate all’interno di nodi Shape in un documento. Per estrarre tutte le immagini o le immagini aventi un tipo specifico dal documento, attenersi alla seguente procedura:

  • Utilizzare il metodo getChildNodes per selezionare tutti i nodi Forma.
  • Scorrere le raccolte di nodi risultanti.
  • Controllare la proprietà booleana hasImage.
  • Estrarre i dati dell’immagine utilizzando la proprietà ImageData.
  • Salvare i dati dell’immagine in un file.
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(ExtractImagesToFiles.class);
Document doc = new Document(dataDir + "Image.SampleImages.doc");
NodeCollection<Shape> shapes = (NodeCollection<Shape>) doc.getChildNodes(NodeType.SHAPE, true);
int imageIndex = 0;
for (Shape shape : shapes
) {
if (shape.hasImage()) {
String imageFileName = String.format(
"Image.ExportImages.{0}_out_{1}", imageIndex, FileFormatUtil.imageTypeToExtension(shape.getImageData().getImageType()));
shape.getImageData().save(dataDir + imageFileName);
imageIndex++;
}
}

Come inserire il codice a barre in ogni pagina del documento

Questo esempio consente di aggiungere gli stessi o diversi codici a barre in tutte o pagine specifiche di un documento di Word. Non esiste un modo diretto per aggiungere codici a barre su tutte le pagine di un documento, ma è possibile utilizzare i metodi moveToSection, moveToHeaderFooter e insertImage per passare a qualsiasi sezione o intestazioni/piè di pagina e inserire le immagini del codice a barre come si può vedere nel codice seguente.

Il seguente esempio di codice mostra come inserire un’immagine di codice a barre in ogni pagina di un documento:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(InsertBarcodeImage.class);
Document doc = new Document(dataDir + "Image.SampleImages.doc");
DocumentBuilder builder = new DocumentBuilder(doc);
// The number of pages the document should have.
int numPages = 4;
// The document starts with one section, insert the barcode into this existing section.
InsertBarcodeIntoFooter(builder, doc.getFirstSection(), 1, HeaderFooterType.FOOTER_PRIMARY);
InsertBarcodeIntoFooter(builder, doc.getFirstSection(), 1, HeaderFooterType.FOOTER_PRIMARY);
for (int i = 1; i < numPages; i++) {
// Clone the first section and add it into the end of the document.
Section cloneSection = (Section) doc.getFirstSection().deepClone(false);
// cloneSection.getPageSetup().getSectionStart() = SectionStart.NEW_PAGE;
doc.appendChild(cloneSection);
// Insert the barcode and other information into the footer of the section.
InsertBarcodeIntoFooter(builder, cloneSection, i, HeaderFooterType.FOOTER_PRIMARY);
}
dataDir = dataDir + "Document_out_.docx";
// Save the document as a PDF to disk. You can also save this directly to a stream.
doc.save(dataDir);
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
private static void InsertBarcodeIntoFooter(DocumentBuilder builder, Section section, int pageId, int footerType) {
// Move to the footer type in the specific section.
try {
builder.moveToSection(section.getDocument().indexOf(section));
builder.moveToHeaderFooter(footerType);
String dataDir = Utils.getDataDir(InsertBarcodeImage.class);
// Insert the barcode, then move to the next line and insert the ID along with the page number.
// Use pageId if you need to insert a different barcode on each page. 0 = First page, 1 = Second page etc.
builder.insertImage(dataDir + "Barcode1.png");
builder.writeln();
builder.write("1234567890");
builder.insertField("PAGE");
// Create a right aligned tab at the right margin.
double tabPos = section.getPageSetup().getPageWidth() - section.getPageSetup().getRightMargin() - section.getPageSetup().getLeftMargin();
builder.getCurrentParagraph().getParagraphFormat().getTabStops().add(new TabStop(tabPos, TabAlignment.RIGHT, TabLeader.NONE));
// Move to the right hand side of the page and insert the page and page total.
builder.write(ControlChar.TAB);
builder.insertField("PAGE");
builder.write(" of ");
builder.insertField("NUMPAGES");
} catch (Exception x) {
}
}

Blocca le proporzioni dell’immagine

Il rapporto di aspetto di una forma geometrica è il rapporto tra le sue dimensioni in diverse dimensioni. È possibile bloccare le proporzioni di un’immagine usando AspectRatioLocked. Il valore predefinito delle proporzioni della forma dipende da ShapeType. È vero per ShapeType.Image e falso per altri tipi di forma.

Il seguente esempio di codice mostra come lavorare con le proporzioni:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(DocumentBuilderSetImageAspectRatioLocked.class);
// Open the document.
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Shape shape = builder.insertImage(dataDir + "Test.png");
shape.setAspectRatioLocked(false);
doc.save(dataDir + "output.doc");

Come ottenere limiti effettivi di forma in punti

Se si desidera che il riquadro di delimitazione effettivo della forma sia visualizzato nella pagina, è possibile ottenere questo risultato utilizzando la proprietà BoundsInPoints.

Il seguente esempio di codice mostra come utilizzare questa proprietà:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
Shape shape = builder.insertImage(dataDir + "Test.png");
shape.setAspectRatioLocked(false);
System.out.print("\nGets the actual bounds of the shape in points. ");
System.out.println(shape.getShapeRenderer().getBoundsInPoints());

Ritaglia immagini

Il ritaglio di un’immagine di solito si riferisce alla rimozione delle parti esterne indesiderate di un’immagine per migliorare l’inquadratura. Viene anche utilizzato per la rimozione di alcune parti di un’immagine per aumentare la messa a fuoco su una particolare area.

Il seguente esempio di codice mostra come ottenere questo risultato usando Aspose.Words API:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
// The path to the documents directory.
String dataDir = Utils.getDataDir(CropImages.class);
String inputPath = dataDir + "ch63_Fig0013.jpg";
String outputPath = dataDir + "cropped-1.jpg";
cropImage(inputPath, outputPath, 124, 90, 570, 571);
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
public static void cropImage(String inPath, String outPath, int left, int top, int width, int height) throws Exception {
Document doc = new Document();
DocumentBuilder builder = new DocumentBuilder(doc);
BufferedImage img = ImageIO.read(new File(inPath));
int effectiveWidth = img.getWidth() - width;
int effectiveHeight = img.getHeight() - height;
Shape croppedImage = builder.insertImage(img,
ConvertUtil.pixelToPoint(img.getWidth() - effectiveWidth),
ConvertUtil.pixelToPoint(img.getHeight() - effectiveHeight));
double widthRatio = croppedImage.getWidth() / ConvertUtil.pixelToPoint(img.getWidth());
double heightRatio = croppedImage.getHeight() / ConvertUtil.pixelToPoint(img.getHeight());
if (widthRatio < 1)
croppedImage.getImageData().setCropRight(1 - widthRatio);
if (heightRatio < 1)
croppedImage.getImageData().setCropBottom(1 - heightRatio);
float leftToWidth = (float) left / img.getWidth();
float topToHeight = (float) top / img.getHeight();
croppedImage.getImageData().setCropLeft(leftToWidth);
croppedImage.getImageData().setCropRight(croppedImage.getImageData().getCropRight() - leftToWidth);
croppedImage.getImageData().setCropTop(topToHeight);
croppedImage.getImageData().setCropBottom(croppedImage.getImageData().getCropBottom() - topToHeight);
croppedImage.getShapeRenderer().save(outPath, new ImageSaveOptions(SaveFormat.JPEG));
}

Salvataggio delle immagini come WMF

Aspose.Words fornisce la funzionalità per salvare tutte le immagini disponibili in un documento WMFformattare durante la conversione da DOCX a RTF.

L’esempio di codice seguente mostra come salvare le immagini come WMF con le opzioni di salvataggio RTF:

// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Java
String fileName = "TestFile.doc";
Document doc = new Document(dataDir + fileName);
RtfSaveOptions saveOpts = new RtfSaveOptions();
saveOpts.setSaveImagesAsWmf(true);
doc.save(dataDir + "output.rtf", saveOpts);