View all our articles

Adding a text watermark in Python with aiohttp

In this guide, we'll walk you through the process of adding text watermarks to your PDF files, using PDFShift's API.

Adding a watermark to your PDF can be done by adding the watermark object to your query. Adding a text allows you to customize its content and PDFShift's API provides a few properties to help you customize the visual aspect, such as the font size, color, and position.

import aiohttp, asyncio, json, base64

# You can get an API key at
api_key = 'sk_xxxxxxxxxxxx'

params = {
    'source': '',
    'watermark': {
        'text': 'PROTECTED DOCUMENT',
        'offset_x': 'center',
        'offset_top': 'top'

response = None
    auth = base64.b64encode(

    async with aiohttp.ClientSession() as session:
        async with
            headers={'Authorization': f'Basic {auth}'},
        ) as response:
            if response.status >= 400:
                raise Exception('Invalid request: {}'.format(await response.text()))

            with open('result.pdf', 'wb') as f:

            print('The PDF document was generated and saved to result.pdf')
except asyncio.TimeoutError:
    raise Exception('The request took too long to process')
except aiohttp.ClientError as e:
    raise Exception(f'An error occurred: {e}')
except Exception as e:
    # We highly recommend you to handle exceptions. Often, PDFShift will provide you with a clear explanation about what happened.
    # Moreover, in case of error, no PDF are returned !
    raise Exception(f'An error occurred: {e}')

You can customize the text watermark by applying the following properties:

  • font_size: The size of the text. An integer value in pixels. Defaults to 16.
  • font_family : The font family to be used. Defaults to Helvetica.
  • font_color : The color of the text. A hexadecimal color value. Defaults to '000000'.
  • font_opacity : The opacity of the text. A float value between 0 and 100. Defaults to 100.
  • font_bold: A boolean to set the text as bold. Defaults to false.
  • font_italic: A boolean to set the text as italic. Defaults to false.

You can also customize the position of the text watermark by applying the following properties:

  • offset_x: The horizontal position of the text. Can be 'left', 'center', 'right', or a specific value in pixels. Defaults to 'center'.
  • offset_y: The vertical position of the text. Can be 'top', 'middle', 'bottom', or a specific value in pixels. Defaults to 'center'.

For the offset positions, we accept a value in integer which will be translated to pixels, but you can also pass a unit such as 'px', 'in', 'cm', 'mm', 'pt'.

For example:

params = {
    "source": "",
    "watermark": {
        "text": "PROTECTED DOCUMENT",
        "offset_x": "5cm",
        "offset_top": "15mm"

For further details on the watermark property and its usage, please refer to our dedicated documentation.

We hope this guide was helpful. If you have any questions or noticed any issues on the code above,
feel free to drop us a line.