As a hospitality and leisure professional, I hate handwritten notes. So the first thing I do when I work in a new place is make a door sign like “We’ll be back in a minute.”
But what if your colleague from another campsite sees it and wants one too? And then their colleague?
I’m too lazy to make signs for the whole country or company by hand. I could make a template without a number, but my heart breaks by the thought that someone scribbles a phone number on my carefully designed sign. So I had to come with a solution.
So….. Python to the rescue!
You can see the script in action on my Streamlit page : https://rcsmit.streamlit.app/?choice=58
By the way, the examples in this post are quick mock-ups, just to show how it works. Want a version that won’t make your guests cry? Hire me for the real thing. 😉
What you need
This tutorial is not rocket science, but you need a basic knowledge of Python (and be able to run it on your computer) and a design program. I’m more than happy to share with you what I learnt the last days, so you don’t have to invent the wheel another time!
What It Does
This tool:
- Loads a branded template PDF from GitHub
- Inserts a custom phone number and camping name/code on each page
- Positions the text precisely using per-page Y-coordinates
- Applies custom fonts (like Jupiteroid)
- Lets you choose your own colors
- Can support batch generation (from code or spreadsheet) (after modification)
- Runs entirely in your browser with Streamlit, no manual PDF editing needed
To follow this tutorial you will need to know how to work and run a script in Python
Step 1: Make a template
You can create a template in Illustrator, Corel Vector (formerly Gravit Designer), or even Canva.
Just make sure there’s enough space for the phone number and camping code and leave those areas blank. The script has been tested for portrait A4, but it will work probably on all sizes and orientations.
Save the result as a PDF, and upload it to GitHub or a file host if needed.

Step 2 : Find a font
Look for .ttf
fonts (TrueType), these work with PyMuPDF.
I used Jupiteroid, an open domain font, but you should try to use your company’s official font for visual consistency.
Not sure which font your company uses? Open one of their PDFs in Illustrator or Corel Vector, it will show you the exact font name.
Step 3: Install the packages
The script uses streamlit, pymupdf and requests.
pip install streamlit pymupdf requests
Step 4: Copy and adapt the script
It can be found on my github : https://github.com/rcsmit/streamlit_scripts/blob/main/public_doorsigns.py
You might want to change these variables
y_position_dict_str = "{0: 570, 1: 645, 2: 665, 3: 600, 4: 480, 5: 690, 6: 670}"
– the vertical position (in points) of the phone number per page (remember: page 1 = index 0)x_position_camping_name = 30
– left offset for the camping codey_position_camping_name = 810
– vertical position for the camping code
Tip: Match Text Positions to Script
When designing, it’s helpful to note down the Y-positions in centimeters. In the Python script, these are converted to points: 1 cm = 28.35 points
.
You have also to take account the font size, and more specific the Cap height. In most fonts the cap height is 70% of the font size, so the formula is : capheight = font size * 0.7
. [see discussion here]. You can use a drawing program to find out the exact ratio.

So if you want the phone number of 200px to appear 6.5 cm from the top, set:
y = (6.5 * 28.35) + (200 * 0.7) = 184.3
+ 140 = 324.3
If you want a text in the vertical center you can use
y = ((page.rect.height - (font_size*0.7))/2) + font_size * 0.7
Step 5: Run the script
Use streamlit run public_doorsigns.py
Step 6 : Fill in the phone number and camping name/code
Now you can use the interface:
- Enter the camping name/code
- Enter the phone number
- Choose your colors for both text elements

Step 7 : Download the result

Just hit the download button
Step 8 : Enjoy the result
Here you go 🙂 You can even edit the files in Illustrator or Corel Vector if you need some fine tuning.

Also for housenumbers and parking signs!
You can also use/adapt the script for housenumbers or parking signs. Isn’t it cool?

Little remark
The process is fully automated. Some fonts may cause numbers or text to appear misaligned if certain characters are narrower or shorter. It also doesn’t account for things like overshoot.

Keep that in mind when using the script and templates. As you see above, the misalignment is not there when you put everything on a horizontal “line”.
Need Customization?
Want to:
- Add logos or QR codes?
- Adjust font size or page layouts?
- Pull phone numbers dynamically from a spreadsheet?
Get in touch with me!