Praca z obrazami

Aspose.Words pozwala użytkownikom pracować z obrazami w bardzo elastyczny sposób. W tym artykule możesz poznać tylko niektóre możliwości pracy z obrazami.

Wstawianie obrazu

DocumentBuilder zapewnia kilka przeciążeń metody insert_image, które umożliwiają wstawienie obrazu wbudowanego lub pływającego. Jeśli obraz jest metaplikiem EMF lub WMF, zostanie wstawiony do dokumentu w formacie metapliku. Wszystkie pozostałe obrazy będą przechowywane w formacie PNG. Metoda Umieść obraz może wykorzystywać obrazy z różnych źródeł:

  • Z pliku lub URL, przekazując parametr typu string
  • Ze strumienia poprzez przekazanie parametru Stream
  • Z tablicy bajtów poprzez przekazanie parametru tablicy bajtów

Dla każdej z metod Umieść obraz istnieją dalsze przeciążenia, które umożliwiają wstawienie obrazu z następującymi opcjami:

  • Inline lub pływający w określonej pozycji, na przykład Umieść obraz
  • Skala procentowa lub rozmiar niestandardowy; ponadto metoda DocumentBuilder.insert_image zwraca obiekt Shape, który właśnie został utworzony i wstawiony, dzięki czemu można dalej modyfikować właściwości Shape

Wstawianie obrazu wbudowanego

Przekaż pojedynczy ciąg reprezentujący plik zawierający obraz do insert_image, aby wstawić obraz do dokumentu jako grafikę wstawioną.

Poniższy przykład kodu pokazuje, jak wstawić obraz osadzony w pozycji kursora do dokumentu:

doc = aw.Document()
builder = aw.DocumentBuilder(doc)

builder.insert_image(docs_base.images_dir + "Logo.jpg")

doc.save(docs_base.artifacts_dir+"WorkingWithImages.document_builder_insert_inline_image.doc")

Wstawianie pływającego (całkowicie ustawionego) obrazu

Poniższy przykład kodu pokazuje, jak wstawić pływający obraz z pliku lub URL w określonej pozycji i rozmiarze:

doc = aw.Document()
builder = aw.DocumentBuilder(doc)

builder.insert_image(docs_base.images_dir + "Logo.jpg",
    aw.drawing.RelativeHorizontalPosition.MARGIN,
    100,
    aw.drawing.RelativeVerticalPosition.MARGIN,
    100,
    200,
    100,
    aw.drawing.WrapType.SQUARE)

doc.save(docs_base.artifacts_dir+"WorkingWithImages.document_builder_insert_floating_image.doc")

Jak wyodrębnić obrazy z dokumentu

Wszystkie obrazy są przechowywane w węzłach Shape w formacie Document. Aby wyodrębnić z dokumentu wszystkie obrazy lub obrazy określonego typu, wykonaj następujące kroki:

Poniższy przykład kodu pokazuje, jak wyodrębnić obrazy z dokumentu i zapisać je jako pliki:

Możesz pobrać plik szablonu tego przykładu z Tutaj.

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document(docs_base.my_dir + "Images.docx")
shapes = doc.get_child_nodes(aw.NodeType.SHAPE, True)
imageIndex = 0
for shape in shapes :
shape = shape.as_shape()
if (shape.has_image) :
imageFileName = f"Image.ExportImages.{imageIndex}_{aw.FileFormatUtil.image_type_to_extension(shape.image_data.image_type)}"
shape.image_data.save(docs_base.artifacts_dir + imageFileName)
imageIndex += 1

Jak wstawić kod kreskowy na każdej stronie dokumentu

Ten przykład pokazuje, jak dodać te same lub różne kody kreskowe na wszystkich lub określonych stronach dokumentu programu Word. Nie ma bezpośredniego sposobu dodawania kodów kreskowych na wszystkich stronach dokumentu, ale można użyć metod move_to_section, move_to_header_footer i insert_image, aby przejść do dowolnej sekcji lub nagłówka/stopki i wstawić obrazy kodów kreskowych, jak widać w poniższym kodzie.

Poniższy przykład kodu wstawia obraz kodu kreskowego na każdej stronie dokumentu.

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document()
builder = aw.DocumentBuilder(doc)
# The number of pages the document should have
numPages = 4
# The document starts with one section, insert the barcode into this existing section
self.insert_barcode_into_footer(builder, doc.first_section, aw.HeaderFooterType.FOOTER_PRIMARY)
for i in range(1, numPages) :
# Clone the first section and add it into the end of the document
cloneSection = doc.first_section.clone(False).as_section()
cloneSection.page_setup.section_start = aw.SectionStart.NEW_PAGE
doc.append_child(cloneSection)
# Insert the barcode and other information into the footer of the section
self.insert_barcode_into_footer(builder, cloneSection, aw.HeaderFooterType.FOOTER_PRIMARY)
# Save the document as a PDF to disk
# You can also save this directly to a stream
doc.save(docs_base.artifacts_dir + "InsertBarcodeImage.docx")
# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
@staticmethod
def insert_barcode_into_footer(builder : aw.DocumentBuilder, section : aw.Section, footerType : aw.HeaderFooterType) :
# Move to the footer type in the specific section.
builder.move_to_section(section.document.index_of(section))
builder.move_to_header_footer(footerType)
# 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.insert_image(docs_base.images_dir + "Barcode.png")
builder.writeln()
builder.write("1234567890")
builder.insert_field("PAGE")
# Create a right-aligned tab at the right margin.
tabPos = section.page_setup.page_width - section.page_setup.right_margin - section.page_setup.left_margin
builder.current_paragraph.paragraph_format.tab_stops.add(aw.TabStop(tabPos, aw.TabAlignment.RIGHT, aw.TabLeader.NONE))
# Move to the right-hand side of the page and insert the page and page total.
builder.write(aw.ControlChar.TAB)
builder.insert_field("PAGE")
builder.write(" of ")
builder.insert_field("NUMPAGES")

Zablokuj współczynnik proporcji obrazu

Proporcje kształtu geometrycznego to stosunek jego rozmiarów w różnych wymiarach. Możesz zablokować proporcje obrazu za pomocą aspect_ratio_locked. Domyślna wartość współczynnika proporcji kształtu zależy od ShapeType. Jest to True dla ShapeType.IMAGE i False dla innych typów kształtów.

Poniższy przykład kodu pokazuje, jak pracować ze współczynnikiem proporcji:

doc = aw.Document()
builder = aw.DocumentBuilder(doc)

shape = builder.insert_image(docs_base.images_dir + "Logo.jpg")
shape.aspect_ratio_locked = False

doc.save(docs_base.artifacts_dir+"WorkingWithImages.set_aspect_ratio_locked.doc")

Jak uzyskać rzeczywiste granice kształtu w punktach

Jeśli chcesz, aby rzeczywista ramka ograniczająca kształt była renderowana na stronie, możesz to osiągnąć za pomocą właściwości bounds_in_points.

Poniższy przykład kodu pokazuje, jak używać tej właściwości:

doc = aw.Document()
builder = aw.DocumentBuilder(doc)

shape = builder.insert_image(docs_base.images_dir + "Logo.jpg")
shape.aspect_ratio_locked = False

print("\nGets the actual bounds of the shape in points.")
rect = shape.get_shape_renderer().bounds_in_points
print(f"{rect.x}, {rect.y}, {rect.width}, {rect.height}")

Przytnij obrazy

Kadrowanie obrazu zwykle oznacza usunięcie niepożądanych zewnętrznych części obrazu w celu poprawy kadrowania. Służy również do usuwania niektórych części obrazu w celu zwiększenia ostrości na określonym obszarze.

Poniższy przykład kodu pokazuje, jak to osiągnąć za pomocą Aspose.Words API:

# The path to the documents directory.
inputPath = docs_base.images_dir + "Logo.jpg"
outputPath = docs_base.artifacts_dir + "cropped_logo.jpg"

self.crop_image(inputPath,outputPath, 100, 90, 200, 200)
@staticmethod
def crop_image(inPath : str, outPath : str, left : int, top : int, width : int, height : int) :
    
    doc = aw.Document();
    builder = aw.DocumentBuilder(doc)
    
    croppedImage = builder.insert_image(inPath)
    
    src_width_points = croppedImage.width
    src_height_points = croppedImage.height
    
    croppedImage.width = aw.ConvertUtil.pixel_to_point(width)
    croppedImage.height = aw.ConvertUtil.pixel_to_point(height)
    
    widthRatio = croppedImage.width / src_width_points
    heightRatio = croppedImage.height / src_height_points
    
    if (widthRatio< 1) :
        croppedImage.image_data.crop_right = 1 - widthRatio
    
    if (heightRatio< 1) :
        croppedImage.image_data.crop_bottom = 1 - heightRatio
    
    leftToWidth = aw.ConvertUtil.pixel_to_point(left) / src_width_points
    topToHeight = aw.ConvertUtil.pixel_to_point(top) / src_height_points
    
    croppedImage.image_data.crop_left = leftToWidth
    croppedImage.image_data.crop_right = croppedImage.image_data.crop_right - leftToWidth
    
    croppedImage.image_data.crop_top = topToHeight
    croppedImage.image_data.crop_bottom = croppedImage.image_data.crop_bottom - topToHeight
    
    croppedImage.get_shape_renderer().save(outPath, aw.saving.ImageSaveOptions(aw.SaveFormat.JPEG))

Zapisywanie obrazów w formacie WMF

Aspose.Words zapewnia funkcję zapisywania wszystkich dostępnych obrazów w dokumencie do formatu WMF podczas konwersji DOCX do RTF.

Poniższy przykład kodu pokazuje, jak zapisywać obrazy w formacie WMF z opcjami zapisywania w formacie RTF:

# For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-Python-via-.NET
doc = aw.Document(docs_base.my_dir + "Document.docx")
saveOptions = aw.saving.RtfSaveOptions()
saveOptions.save_images_as_wmf = True
doc.save(docs_base.artifacts_dir + "WorkingWithRtfSaveOptions.saving_images_as_wmf.rtf", saveOptions)