A Judgmental Introduction
Society splits itself in two different kind of people when it comes to time perception: those perpetually occupied by work and worries and those investing remarkable creativity in avoiding effort altogether.
Whatever definition fits the role - leaving aside any unavoidable moral judgment - it is fair to say that time is a sacre resource, and the demand for more is, indeed, universal.
Context: Tender Documents
I was already too busy when the opportunity of gain from tender procedures partecipation became clear - I had little understanding on how the process worked and filling all the required documentation alone could consume an entire working day.
Even once the mechanism became familiar, it was still requiring roughly half a working day. That was still much as the amount cumulated up to a dozen documents.
A pattern emerged: each contracting authority is using the same forms and documents structure, changing only dynamic data such as tender object and prices. The rest of the declarations are left to the user.
To reduce the required time I prepared pre-filled documents containing my static data, then applying the dynamic data by copy-pasting to each document.
I knew this process could be automated and since I hate repetitive tasks and love automation, I chose to build a tool for this - likely spending more than than it would have saved me. Or so I tought.
The Tool: PDF Compiler
I won't dwell on the development journey. Let's get to a specific description of the workflow.
1. Configuration
Create a project and upload PDF files to it.
Insert the specified fields inside each document using the file viewer, positioning them in a simple drag and drop and applying the appropriate format.
This configuration process is executed once per project.
2. Input
All of the fields of type input or selection are prompted through a simple web interface.
Required data is filled once.
3. Output
The complete set of documents is ready and populated.
All the injected data is applied to each field requiring it, and other fields are automatically populated based on their field types.
Note: Everything is determistic. No AI is used inside the process, nor has any been used to write any part of the code. The whole solution is entirely written by hand.
Frontend? I tried to. UX was poor. There was no time to learn any framework to improve it. Used Lovable based on my previous frontend.
Excel Support
Each row in an Excel file represents a complete set of input data for a project.
Example:
8 templates + Excel with 5 rows = 40 total documents.
Tested on low traffic: ~50 seconds total from upload to completion.
Flow of Tought: Problem Resolution
1. Putting the same data manually inside each document or inserting it once when the server asks for it? Absurd.
- Automatic dates: Select timezone and format; the current date time will be applied.
2. Calculating the discounted price ONCE and filling it ONCE in my SIMPLE web UI? Absurd.
- Formulas: mathematical operations can be applied to fields in input, and the result filled in specified position (e.g. price * discount)
3. Prompting for data that changes monthly or yearly every single time? Absurd.
- Account References: Data is stored inside account, can be updated at any time and can be referenced by any document field (e.g. business volume).
This concept has evolved to a Client section, allowing client-specific data to be referenced at compile time.
Final Considerations
This tool is a not PDF generator, nor a PDF editor. That's not the purpose.
The tool is intended for workflows requiring recurring data population in across multiple already existing document templates, without writing a single line of code or deal with scripting. It is not intended for precise layout generation or document design. In my specific use case, this converted my workflow from hours to minutes, effectively saving an unexpected amount of time.
To anyone who would like to try it, a demo is available on the website.
If any help or additional information is needed, you can reach out to info@pdf-compiler.com.
Don't hesitate to contact.