Introduction
In addition to the high-level PsDocument and XpsDocument classes, Aspose.Page FOSS for
Python exposes a set of lower-level utilities for building render documents, writing PDF
output, and working with XPS packages programmatically. These utilities are used internally
by the high-level classes and can also be used directly when you need precise control over
the output.
This article covers RenderModelBuilder, PdfWriter, PdfMetadata, RasterRenderer, and
XpsDocumentBuilder — the common components shared across PS, EPS, and XPS pipelines.
Building a Render Document
RenderModelBuilder constructs a RenderDocument incrementally by calling page lifecycle
methods. Start a page with begin_page(), add drawing commands, then call end_page().
Call document() to retrieve the completed RenderDocument.
from aspose.page.render.model import RenderModelBuilder
builder = RenderModelBuilder()
builder.begin_page(595, 842)
# add paths, text, images here
builder.end_page()
doc = builder.document()
Available drawing methods include add_path(), add_text(), add_image(), clip(),
save_state(), and restore_state(). Call set_default_page_size() before begin_page()
to establish a default size that applies to all subsequent pages.
Writing a Render Document to PDF
PdfWriter accepts a PdfMetadata instance and serializes a RenderDocument to PDF 1.4
bytes. Pass a PdfMetadata object with title, creator, producer, creation_date,
mod_date, and trapped fields, then call write(doc) to produce the output.
from aspose.page.render.model import RenderModelBuilder
from aspose.page.pdf.writer import PdfWriter
from aspose.page.pdf.metadata import PdfMetadata
from pathlib import Path
builder = RenderModelBuilder()
builder.begin_page(595, 842)
builder.end_page()
doc = builder.document()
metadata = PdfMetadata(
title="My Document",
creator="My App",
producer="Aspose.Page FOSS for Python",
creation_date="D:20260609000000",
mod_date="D:20260609000000",
trapped=False,
)
writer = PdfWriter(metadata)
pdf_bytes = writer.write(doc)
Path("output.pdf").write_bytes(pdf_bytes)
Raster Rendering
RasterRenderer renders a RenderDocument to a RasterSurface — an in-memory RGBA pixel
buffer. The RasterSurface provides get_pixel() and set_pixel() for direct pixel
access, along with width and height properties. This is the underlying mechanism used
by to_image() on both PsDocument and XpsDocument when producing PNG or JPEG output.
from aspose.page.render.model import RenderModelBuilder
from aspose.page.image.raster_renderer import RasterRenderer
builder = RenderModelBuilder()
builder.begin_page(400, 300)
builder.end_page()
doc = builder.document()
renderer = RasterRenderer()
surface = renderer.render(doc, page_index=0)
print(f"Surface size: {surface.width}x{surface.height}")
Building XPS Documents Programmatically
XpsDocumentBuilder provides a high-level API for constructing XPS packages with custom
pages and metadata. Use create_page() to add pages, then call to_document() to obtain
an XpsDocument that can be further exported to PDF or raster images.
from aspose.page.xps.document import XpsDocument
xps = XpsDocument.create("My XPS Document")
page = xps.add_page(595, 842)