Skip to content

Demo202509 PDF Printing

Summary of Requirements

The Requirement is included in the Create and Print Kanban Card Use Case.

Printing needs to produce high-quality layouts of information that can be printed and used in industrial environments. Previous experience
with printing based on HTML and CSS formatting has shown that it is very hard and requires high technical expertise to achieve these results.

In the long term, the intent is to allow users to define their own layouts and templates to print information, which makes PDF an attractive choice
given the availability of tools and editors.

Printing for the Demo is confined to printing information available in a Kanban Card, including the details of the Item that is associated with it.

There are three initial layouts needed:

  1. Card Layout to be used in Kanban signalling.
  2. Label Layout to be used for location and bin labels in inventory.
  3. Breadcrumb Layout to be used for smaller spaces (e.g., shelf edges)

QR Lookup URL

The format of the URL for the QR Code to be printed in the PDF rendering was introduced in the Format of URL in QR ticket and should follow the following format:

https://{app-hostname}/kanban/cards/{eId}?view=card&src=qr

Where:

  • app-hostname is the hostname of the Arda Front-End Application. See below for known hostnames.
  • eId is the entity id (eId field) of the kanban card.

Known Hostnames

Known hostnames follow the pattern, for different development “purposes”:

Purpose Hostname
dev dev.app.arda.cards
stage stage.app.arda.cards
prod live.app.arda.cards

Internal Hostnames

Other hostnames may be used for special tests but it is discouraged as these may change at any time.

Purpose Hostname
dev dev.alpha002.app.arda.cards
stage stage.alpha002.app.arda.cards
prod prod.alpha001.app.arda.cards

Additional considerations

It is desirable to be able to reuse the layouts and designs already available in the context of the Coda product.

Available Technology

Arda already uses Documint for PDF generation for its Coda based product. Document generation is done through
an intermediate API and Service Layer. The API Endpoint is documented at: PDF Rendering API

Options

For the Demo202509 release there are five options available for PDF printing:

  1. Implement an HTML/CSS based solution in the front end.
  2. Use the Documint service directly:
    1. From the Front End or the BFF.
    2. From the Kanban Card Module in the backend.
  3. Use the current API Endpoint and Service
    1. From the Front End or BFF.
    2. From the Kanban Card Module in the backend.

The first option, given the long term direction of this feature will not be considered further.

Existing Templates and Layouts

Customer Service (Matt Hager) has provided these three Documint Templates for the three required layouts. To access them, use the
credentials available in 1Password under Documint with the user systems-sandbox@arda.cards.

General

These layouts can be used to print multiple cards and are intended to use a Letter paper size, optionally with pre-cut divisions (e.g., Avery labels)

Their data inputs have a structure in rows and columns.

Although not restricted by the schema, the maximum number of column elements per row is 2 to keep the overall grid reasonable to print
on Letter format.

Payload Fields

Although Layouts differ in the contents of their payloads, their field names are common and can be mapped consistently to the information in the Kanban Card Details:

Schema Name Description Source: From KanbanCardDetails
characters A layout control field with values: \({1, 2, 3}\) See below
item_name Name of the Associated Item item.name
notes Notes associated with the Kanban Card notes
print_sku Internal SKU associated with the Item item.internalSku
qr_code URL, to be displayed QR Code format to the Card View Page https://hostname/card/${lookupUrlId}
thin_line A layout control field, URL to a thin line image Static URL (may depend on item.color)
word_minimum An Image sent to Documint for rendering indexed by item.color
text_size A layout control field See below
min_qnty The minimum quantity to keep for an item item.minQty (to be added)
word_location An Image sent to Documint for rendering Indexed by item.color
location The location assigned to the Item item.locator.location
word_order An Image sent to Documint for rendering Indexed by item.color
order_qnty The recommended order quantity for the default Supplier item.defaultSupplier.orderQuantity.amount
order_mechanism The method to order from the default Supplier item.defaultSupplier.orderMethod
word_supplier An Image sent to Documint for rendering Indexed by item.color
supplier The name of the default supplier item.defaultSupply
product_image A Base64 encoded image of the product (GET item.imageUrl).base64()
color_bar A URL to a color bar image based on the item color Static URL
logo URL or Base64 image? Static URL for now. Future: tenant configuration.
thin_light_rectangle URL of an image to send to Documint Indexed by item.color (TBC)
light_rectangle URL of an image to send to Documint Indexed by item.color (TBC)
Missing Fields in current implementation
  • min_qnty: This was omitted in anticipation of multi-facility support. It will be added back for the demo.
  • logo: This should be part of the tenant configuration, which is not in scope for the demo. It could be hardcoded for the demo.
Special Calculations
  • defaultSupplier
when(item.defaultSupply) {
 item.primarySupply.supplier -> item.primarySupply
 item.secondarySupply.supplier -> item.secondarySupply
 else -> Error("Item ${item.name} `defaultSupply` is not properly configured: ${item.defaultSupply}")
}
  • characters calculation:
    when (item.name.length) {
      in 0..18  -> "1"
      in 19..30 -> "2"
      else      -> "3"
    }
    
  • text_size calculation:

// "text_size" key for the JSON-like object
when(val maxLength = list(
  item.default_supplier.orderQuantityUnits.length(),
  item.minQty.unit.length(),
  item.locator.location.length(),
).max()) {
  in 0..22 -> "1"
  else     -> "2"
}

From Mat Hager, to be removed once clarified:

// Build a list of candidate fields whose length we'll compare
list(
  // Units used for the order quantity (e.g., "pcs")
  thisRow.[Order Units],
  // Units used for the minimum quantity
  thisRow.[Min. Units],
  // Use the normalized Location Name if thisRow.Location matches a known Location
  If(
    Locations.Name.ToText().Contains(thisRow.Location),
    thisRow.Location.Name,
    // Otherwise use whatever is in the row's Location field
    thisRow.Location
  ),
  // Supplier name
  thisRow.Supplier
)
  // Pick the longest entry from that list
  .MaxBy(
    CurrentValue.Length()
  )
  // Measure the character count of that longest entry
  .Length()
  // Name it "length" just for the next step
  .WithName(
    length,
    // If over 22 chars, return 2 (needs more space); else 1
    switchif(length > 22, 2, 1)
  )

Special (Image) fields

This is to be completed.

Format is either Image URL or some string based encoding of the image.
Source is the logic to find the right image to send.

The following fields are URLs to images and determined based on lookup tables in colors.json and color-options.json from
the Item Color.

  • thin_line
  • word_minimum
  • word_location
  • word_order
  • word_supplier
  • color_bar
  • thin_light_rectangle
  • light_rectangle

product_image is an image URL from the Item.imageUrl field.

logo should be the image URL to the Company Logo. For now, it is blank.

Schema

{
  "type":"object",
  "properties":{
    "row":{
      "type":"array",
      "items":{
        "type":"object",
        "properties":{
          "column":{
            "type":"array",
            "items":{
              "type":"object",
              "properties":{
                [Payload Specific]
              }
            }
          }
        }
      }
    }
  }
}

Example.

{
  "row": [
    {
      "column": [
        {
          [payload_1_1]
        },
        {
          [payload_1_2]
        }
      ]
    },
    {
      "column": [
        {
          [payload_2_1]
        },
        {
          [payload_2_2]
        }
      ]
    }
  ]
}

Kanban Card Layout

Documint Template

Card layout preview

Payload Fields

Documint Schema

{
  "type":"object",
  "properties":{
    "characters":{ "type":"string" },
    "item_name":{ "type":"string" },
    "notes":{ "type":"string" },
    "print_sku":{ "type":"string" },
    "qr_code":{ "type":"string" },
    "thin_line":{ "type":"string" },
    "word_minimum":{ "type":"string" },
    "text_size":{ "type":"string" },
    "min_qnty":{ "type":"string" },
    "word_location":{ "type":"string" },
    "location":{ "type":"string" },
    "word_order":{ "type":"string" },
    "order_qnty":{ "type":"string" },
    "order_mechanism":{ "type":"string" },
    "word_supplier":{ "type":"string" },
    "supplier":{ "type":"string" },
    "product_image":{ "type":"string" },
    "color_bar":{ "type":"string" },
    "logo":{ "type":"string" }
  }
}

In addition to the general payload fields, the following fields are specific to the Kanban card layout:

{
  [...]
  "today": { "type": "string" },
  "item_name": { "type": "string" }
  [...]
}

Example

{
  "characters": "3",
  "item_name": "Sample Item",
  "notes": "Sample notes",
  "print_sku": "Sample SKU",
  "qr_code": "Sample QR Code",
  "thin_line": "Sample Thin Line",
  "word_minimum": "Sample Word Minimum",
  "text_size": "Sample Text Size",
  "min_qnty": "Sample Min Quantity",
  "word_location": "Sample Word Location",
  "location": "Sample Location",
  "word_order": "Sample Word Order",
  "order_qnty": "Sample Order Quantity",
  "order_mechanism": "Sample Order Mechanism",
  "word_supplier": "Sample Word Supplier",
  "supplier": "Sample Supplier",
  "product_image": "Sample Product Image",
  "color_bar": "Sample Color Bar",
  "logo": "Sample Logo"
}

Label Layout

Documint Template

Label layout preview

Payload Fields

Documint Schema

{
  "type":"object",
  "properties":{
    "item_name":{ "type":"string" },
    "characters":{ "type":"string" },
    "notes":{ "type":"string" },
    "thin_line":{ "type":"string" },
    "print_sku":{ "type":"string" },
    "qr_code":{ "type":"string" },
    "product_image":{ "type":"string" },
    "color_bar":{ "type":"string" },
    "logo":{ "type":"string" }
  }
}

Example

{
  "item_name": "Sample Item",
  "characters": "Sample Characters",
  "notes": "Sample Notes",
  "thin_line": "https://codaio.imgix.net/docs/y9-aNYpZAA/blobs/bl-jV4BZylBKS/6dbbf1bc3ccc7cd71877cab82cd25471522f28fa6835a6103a0d811843418e916403e9666eb2ac5036f0f1db5dec8727455a2a0047b0c464971a9a0e46095ea2ad317412e9be5e1524195c5ae2d571f5d061dbefb06234fc80ac30efcde49852ec87079d",
  "print_sku": "Sample Print SKU",
  "qr_code": "https://link.arda.cards/lichen/items/1",
  "product_image": "data:image/jpeg;base64,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",
  "color_bar": "https://codaio.imgix.net/docs/y9-aNYpZAA/blobs/bl-0u4VcOqeEZ/38e2ec507460280db05be2693d4c5d6da7b425fd3f07692c8b900d9a4e2d9b233f069bec45bc0433ab9732f2c37b5bdb800f4ca8648b792121bc2d700d3608315df1bd5ce86638b8a1fb7e66cbc09a02beb22edf2aa96243ddaaf440cd842852fc81995d?txt64=TWFjaGluaW5nLCAzRCBQcmludGluZw%3D%3D&txt-font=sans-serif&txt-size=46&txt-color=ff8c00&txt-line=1&txt-line-color=ff8c00&txt-shad=1&txt-pad=1&txt-lig=0&txt-align=center%2Cmiddle&txt-width=600&txt-fit=max",
  "logo": "<...>"
}

Documint Template

Breadcrumb layout preview

{
  "type":"object",
  "properties":{
    "item_name":{
      "type":"string"
    },
    "characters":{
      "type":"string"
    },
    "notes":{
      "type":"string"
    },
    "thin_light_rectangle":{
      "type":"string"
    },
    "print_sku":{
      "type":"string"
    },
    "qr_code":{
      "type":"string"
    },
    "logo":{
      "type":"string"
    },
    "product_image":{
      "type":"string"
    },
    "light_rectangle":{
      "type":"string"
    }
  }
}
{
  "item_name": "Sample Item",
  "characters": "Sample Characters",
  "notes": "Sample Notes",
  "thin_light_rectangle": "Sample Thin Light Rectangle",
  "print_sku": "Sample Print SKU",
  "qr_code": "Sample QR Code",
  "logo": "Sample Logo",
  "product_image": "Sample Product Image",
  "light_rectangle": "Sample Light Rectangle"
}

Design Proposal

Given the complex logic and need to retrieve image files, a dedicated module is recommended. This module, initially in the operations component, will work with the Kanban Card Module.

  1. Shared Capabilities with the Kanban Card Module (boundary to be decided)
    1. Selection of Images and Media Files based on Indexing values.
  2. new Pdf-Render Module Capabilities
    1. Storage and Lookup of Templates for different Use Cases and formats
    2. Access to Documint, including formatting of requests, error handling, etc…
  3. Additional Capabilities required in the Item and Kanban Modules
    1. Computation of color based on other item attributes
    2. Adding MinQuantity attribute to Item Entity (even though it will move to a different entity later)
  4. Other
    1. Configuration of Logo based on tenant.

© 2025 Arda Systems, All rights reserved

Comments