# Working with pages

This section details with how to view and edit the contents of a page.

pikepdf is not an ideal tool for producing new PDFs from scratch – and there are many good tools for that, as mentioned elsewhere. pikepdf is better at inspecting, editing and transforming existing PDFs.

Page objects in PDFs are dictionaries.

    In [1]: from pikepdf import Pdf, Page

    In [2]: example = Pdf.open('../tests/resources/congress.pdf')

    In [3]: pageobj1 = example.pages[0]

    In [4]: pageobj1
    Out[4]:
    <pikepdf.Dictionary(type_="/Page")({
      "/Contents": pikepdf.Stream(stream_dict={
          "/Length": 50
        }, data=<...>),
      "/MediaBox": [ 0, 0, 200, 304 ],
      "/Parent": <reference to /Pages>,
      "/Resources": {
        "/XObject": {
          "/Im0": pikepdf.Stream(stream_dict={
              "/BitsPerComponent": 8,
              "/ColorSpace": "/DeviceRGB",
              "/Filter": [ "/DCTDecode" ],
              "/Height": 1520,
              "/Length": 192956,
              "/Subtype": "/Image",
              "/Type": "/XObject",
              "/Width": 1000
            }, data=<...>)
        }
      },
      "/Type": "/Page"
    })>

The page’s `/Contents` key contains instructions for drawing the page content. This is a content stream, which is a stream object that follows special rules.

Also attached to this page is a `/Resources` dictionary, which contains a single XObject image. The image is compressed with the `/DCTDecode` filter, meaning it is encoded with the DCT, so it is a JPEG. pikepdf has special APIs for working with images.

The `/MediaBox` describes the bounding box of the page in PDF pt units (1/72” or 0.35 mm).

You can access the page dictionary data structure directly, but it’s fairly complicated. There are a number of rules, optional values and implied values. It’s easier to use page helpers, which ensure that the page is modified in a semantically correct manner.

## Page helpers

pikepdf provides a helper class, `pikepdf.Page`, which provides higher-level functions to manipulate pages than the standard page dictionary used in the previous examples.

Currently pikepdf does not automatically return helper classes. You must initialize them. In a future release, it will return them automatically.

    In [5]: from pikepdf import Pdf, Page

    In [6]: page = Page(pageobj1)

    In [7]: page.trimbox
    Out[7]: pikepdf.Array([ 0, 0, 200, 304 ])

One advantage of page helpers is that they resolve implicit information. For example, `page.trimbox` will return an appropriate trim box for this page, which in this case is equal to the media box.