Very user friendly interface

Front end and back end project

UI Print

A front end a back end flyers and brochures creator built with React and Node.js

This tool generates print quality pdf documents from user's pictures and custom texts. It is used by companies in the real estate industry to create flyers and brochures for their listings. I designed the user interface to be very user friendly and intuitive, allowing users to easily upload their pictures or use the ones our photo agency delivered, customize their text and generate their pdf documents with just a few clicks. The tool also includes a variety of templates and customization options to allow users to create unique and professional looking flyers and brochures that stand out in the market.

Ui Print in action

Here is a video of me using the tool to create a flyer for a listing. I explain how this tool helps users to create professional looking flyers and brochures with ease, I also show some of the customization options available in the tool, such as different templates, page layouts and font choices, that allow users to create unique and eye-catching marketing materials for their listings.

This video is in french. Scroll down for English explanations.

Details

A Real estate agent can create a flyer for a listing in less than 5 minutes with this tool. The user interface is designed to be very user friendly and intuitive. The tool automatically adjusts the size and placement of the pictures to ensure that they are of high quality and properly aligned on the flyer while allowing high customization.

The main feature that allows this tool to create high quality pdf documents is the monitoring of picture resulting resolution and placement on the flyer. Errors and warnings are presented in a clickable list, allowing users to easily identify and fix any issues with their pictures, such as low resolution or incorrect placement, ensuring that the final pdf document is of high quality and ready for printing.

Every project starts with a template. Those are created by a designer using Adobe InDesign and include placeholders for pictures and texts. Templates are saved in IDML format (InDesign Markup Language) and are parsed by the front end to extract the necessary information for the flyer creation process. IDML Objects are converted to fabric.js objects and rendered in a canvas where users can customize their flyer. Once the user is satisfied with their flyer, the front end recreates an IDML file with the customized information and sends it to the Node.js back end where it is rendered as a PDF document. Converting IDML to web objects and then back to IDML is no easy task, you will not find a lot of information on this process online.

Changes for the company

Before using my flyer editor, the company was using a very old and outdated software that was not user friendly at all. It was difficult for users to create flyers and brochures that looked professional, and the process was time consuming. It was slow as hell and costly ($50K us / year).

As we say in Québécois: "Les users étaient su'le cul" (they could not believe how good the new tool was). The new flyer editor has significantly improved the user experience and has allowed users to create high quality flyers and brochures with ease.

Technical Challenges

  • Conducted a detailed analysis of dozens of IDML templates to identify object structures, dependencies, and parameter relationships.
  • Identified and prioritized object types and properties required to achieve functional conversion objectives.
  • Developed server-side components for IDML file management and for regenerating PDF documents from converted IDML.
  • Implemented a browser-based extraction process converting selected IDML objects into JavaScript class instances.
  • Evaluated multiple web graphics libraries and selected Fabric.js to provide higher-level abstraction over the Canvas API.
  • Designed and iteratively refined multiple algorithms to resolve differences in matrix-based positioning systems, addressing:
    • Hierarchical transformations
    • Absolute positioning requirements
    • Transparency inheritance issues
    • Event handling limitations for nested objects
  • Developed a hybrid positioning approach combining recursive matrix resolution and nested visual rendering to accommodate Fabric.js constraints.
  • Addressed image conversion challenges caused by print-specific transformations embedded in IDML, requiring additional metadata extraction and calculation logic.
  • Modified object processing workflows to account for asynchronous resource loading inherent to web environments.
  • Developed custom color conversion logic to approximate CMYK-to-RGB mappings due to the absence of usable web-based ICC decoding libraries.
  • Created polynomial approximations to model IDML tint behavior, which has no direct W3C equivalent.
  • Addressed typography-related uncertainties arising from missing font metrics in IDML and incomplete support in Fabric.js.
  • Modified and extended Fabric.js to improve handling of styled text, paragraph-level properties, and serialization of complex text objects.