Deep Dive: Customizing Print Forms in SAP Logistics Management

I recently wrote a blog about  Managing Print Forms in SAP Logistics Management, where I introduced the process of creating your own print forms in SAP Logistics Management (LGM henceforth). Whilst in that article I summarily touched upon Adobe Livecycle Designer, the tool you must mandatorily use to craft your own print templates, I had no intention of coming back to this topic until I received a couple of messages asking me to go deeper. So here it goes.

In LGM, print forms play a crucial role in logistics operations, particularly for shipping labels that accompany parcels and shipments to customers. While SAP provides standard out-of-the-box templates, business requirements often demand customization. This guide walks you through customizing a shipping label using Adobe LiveCycle Designer, covering three key enhancements:

  1. Adding a composite ‘dimensions’ field combining height, width, length, and unit of measure
  2. Creating a QR code pointing to a dynamically generated URL that includes the consignment number
  3. Adding a static image (e.g., a forklift icon to denote handling instructions)

These enhancements are represented below in the ‘before / after’ rendition of the Handling Unit Shipping Label we will utilise in this blog (left hand side: Standard out of the box SAP label | right hand side: Our customised label).

You can download the end result xdp file here, if you wish to inspect the customised form more closely yourself in Adobe Livecycle Designer.

I am also, if you prefer to watch the process rather than read about it, referencing here a video of the entire process from start to finish and the timestamps if you wish to go to a specific section:

  • 00:00 Introduction
  • 02:35 The print architecture in LGM
  • 05:50 Generating an out of the box shipping label form
  • 08:05 Moving to Adobe Livecycle Designer
  • 08:50 Introduction to the Adobe Livecycle Window
  • 17:00 Adding a composite ‘Dimensions’ Field
  • 32:30 Adding a QR Code
  • 42:40 Adding a static image
  • 46:20 Uploading and testing the customized form in LGM
  • 49:05 Testing the QR code

Before I go on to delve into the technical details, I want to briefly recap on the Print template architecture in LGM.

Print Template Rule Set

The first step in LGM, is to leverage a processing variant and using the print template ruleset (for warehouse), help LGM to determine which print form it should use to print a label when certain conditions are met. Indeed this is not a one size fits all conundrum! LGM is very flexible and easy to configure and uses a decision table to determine which label print form to use at runtime.

In our scenario, we have imagined that the label format was imposed on us by the carrier. As such our condition table will based on the criteria of:

  • Assigned carrier (LGMPRECAR1)
  • Document type (HUSL – Handling Unit Shipping Label)
  • LGM warehouse (L10) from witch the goods are shipped
  • –> Determine the print template ZPRE_HU_SHIPPING_LABEL_EN

Manage Print Templates

Each print template references an .xdp file (XML Data Package) that defines the form layout and data bindings. This file will be edited in Adobe LiveCycle Designer and must be uploaded back to SAP LGM after customization.

Downloading the Form Template

  1. Navigate to your print template in SAP LGM (via the Manage Print Templates app)
  2. Click on the .xdp file to download it to your local drive
  3. Save it to a dedicated working directory
  4. You can use the preview function (available since March 2026 update) in LGM to verify you’re working with the correct template

Customizing the Form in Adobe Livecycle Designer

Open the form in Adobe LiveCycle Designer

  1. Launch Adobe LiveCycle Designer
  2. Open the downloaded .xdp file
  3. Immediately save it with a new name (e.g., Z_THE_NEW_NAME_OF_THE_FILE.xdp) to preserve the original (in case you need to start fresh!)

Understanding the Interface

You may need to customize the layout of the various panes that I am showing below, but I recommend you try to set it up in a similar manner, so as to show:

  1. A graphical representation of the form layout. There is no data, but gives you a very good idea of what the end product will look like.
  2. The ‘Hierarchy’ tab shows you the list of the fields, objects and sub-forms that are already included in your layout.
  3. The ‘Data View’ tab shows you the fields that are served by an Odata to the form template.
  4. The ‘Scripting’ pane will allow you to use ‘FormCalc’ or ‘Javascript’ to perform code aided changes or validations in your form
  5. The objects palettes are there to show the objects that you can add to your form
  6. This section will show you various tabs that allow you to customise the formatting of a given field or object, as well as bind a form field to an Odata field.

 Data Binding : Connecting an Odata to your form

I have above already made references to ‘Odata’ and ‘Data Binding’. LGM will utilise an Odata service at runtime, to serve data (weight, consignment number, delivery address, etc…) to your form. So when you add a field to your form (or want to see to what Odata field a form field is bound to), you will need to ‘bind’ it to the Odata Service.  You do this in the ‘Binding’ tab. This is illustrated in the image below:

  1. The form field ‘Consigment’
  2. Is via the ‘Binding’ tab
  3. Connected to the ‘Odata-field’ Consignment (5)
  4. Served by the ‘Odata-service’ HandlingUnit

The Data View tab displays all available OData fields, including those not currently used in your form. This is essential when adding new fields to your template.

Customization 1: Adding a Composite ‘Dimensions’ Field

The Challenge

Instead of displaying four separate fields (height, width, length, unit of measure), we want a single field displaying:

120 x 80 x 60 CM

Implementation Steps

Step 1: Add the Required OData Fields

From the Data View tab, drag and drop these fields into your form:

  • Height
  • Width
  • Length
  • Unit of Measure Code

Step 2: Configure Field Properties

For each new field:

  • Set Appearance to “None” (removes the input box styling)
  • Set Caption Position to “Top” (in Layout tab)
  • Verify the Binding is correct (should auto-populate when dragging from Data View)

Step 3: Hide the Source Fields

Since these fields are only needed for calculation:

  • Select each field in the Hierarchy
  • Change Presence to “Hidden (Exclude from Layout)”

Step 4: Create the Display Field (for the Dimensions)

  • Duplicate an existing styled field (e.g., Gross Weight) to maintain consistent formatting
  • Rename it to txtDimensions
  • Remove/check any existing data binding

Step 5: Add the Calculation Script

  • Select the txtDimensions field just created
  • Open the Script Editor pane
  • Select the Calculate event type and add the following script:
if (!handlingUnit.bdyMain.frmInfoBlockRow_1.frmLeftInfoBlock.height) { 
    this.rawValue = "-" 
} else { 
    this.rawValue = height.rawValue + " X " + 
         width.rawValue + " X " + 
         length.rawValue + " " + 
          unitOfMeasureCode.rawValue 
}

How This Works:

  • The calculate event triggers automatically when the form loads
  • The script checks if height data exists – If yes, it concatenates all four values with proper formatting
  • If no, it displays a dash as a placeholder

Customization 2: Adding a Dynamic QR Code

The Business Case

Customers can upon receiving their package leave us a rating to express their (dis)satisfaction by scanning a QR code, but we want the QR code to be specific to a consigment. A dynamic QR code that leads to: http://www.fake-courrier.com/trackingid=CONSIGNMENT_NUMBER enables:

  • Customer feedback collection, specific to a consignment number
  • Tracking which shipment generated the feedback
  • Targeted customer service follow-up in case of a poor rating feedback

Implementation Steps

As we did in the previous step, we will use a field not bound to any Odata per se, to combine the fixed static URL of the web site and the consignment number that will be specific.

Step 1: Insert a new Text Field

  • From the object Library palette, select the object of type ‘Text Field’ and drag it onto your form layout
  • In the hierarchy tab, select your field and rename it (right click) to fullURLname
  • As before hide your field from the form
  • With your field selected, go to the scripting section and add a script of event type ‘Calculate‘ like below to it
if (!handlingUnit.bdyMain.frmInfoBlockRow_1.frmLeftInfoBlock.txtConsignment) { 
   this.rawValue = "-" 
} else { 
   this.rawValue = "http://www.fake-courrier.com/trackingid=" + txtConsignment.rawValue 
}

Step 2: Insert a Barcode Object

  • From the Object Library palette, select Barcode type ‘QR Code’
  • Drag it onto your form at the desired position
  • Resize to approximately 2cm x 2cm (minimum for reliable scanning)

 Step 3: Configure Barcode object

Connect the QR code barcode object to the above field we just created (that combines the fixed web site address + consignment number)

  • Select your QR code object
  • Go to the scripting section and add a event script of type layout:ready (Calculate is not available for this type of object)
  • Add the following code (it essentially says that ‘this field‘ represented by ‘$’ is equal to the value of the field ‘fullURLname
$ = fullURLname.rawValue

Customization 3: Adding a Static Image

Use Case

Display a forklift icon to indicate special handling requirements for heavy parcels.

Implementation Steps

Step 1: Insert an Image Field

  • From the Object Library, select the ‘Image‘ field type
  • Drag it to the desired location on your form
  • Resize to appropriate dimensions (e.g., 3cm x 3cm)

 Step 2: Embed the Image

  • Select the Image Object in the form, then in the Object > Draw pallet
  • Browse to and import your image file (PNG or JPG recommended), by clicking on the ‘folder’ icon next to the URL field
  • Select your image in your chosen folder
  • Select the ‘Embed Image Data‘ check box to ensure the image is part of the .xdp file

Step 3: Set Image Properties

  • Sizing: Set to “Scale Image Proportionally” to maintain aspect ratio
  • Resize and re-position your image as needed

Testing Your Customized Form

Once you are content with your changes, it is time to save your work, and upload your customized .xdp form back into LGM.

Step 1: Upload to SAP LGM

  • Save your .xdp file Adobe Livecycle Designer
  • Open the ‘Manage Print Templates’ app in LGM
  • Upload the new customized form, for your form template

Step 2: Create a Test Handling Unit

  • Open the Packing application ‘Packing Work Center’
  • Create a handling unit with your choice of Packaging Material
  • Add item(s) to the handling unit and Set the dimensions infomration (e.g., 120cm height, 59kg weight)
  • Note down the Handling Unit number
  • Click Print Labels, to close the Handling Unit and print the label

Step 3: Verify Output

  • Go to the Monitor Handling Unit application
  • Enter your handling unit number
  • Click Open File (below the Shipping Label field) to view the generated PDF
  • Verify:
    • Dimensions is displayed correctly, showing heigh, width, length and unit of measure (e.g., “120 x 80 x 60 CM”)
    • QR code scans properly and opens your browser to the correct URL and includes consignment number (use your phone or tablet for this)
    • Static image appears as expected

Conclusion

Customizing print forms in SAP Logistics Management empowers you to meet specific business requirements while maintaining integration with SAP’s logistics processes with ease and flexibility. By understanding the architecture of print template rule sets, mastering data binding via OData, and leveraging Adobe LiveCycle Designer’s scripting capabilities, you can create professional, functional shipping labels that enhance operational efficiency. The three customizations covered—composite ‘dimensions’ field, dynamic QR code, and static image—represent common real-world requirements. These techniques can be extended to many other scenarios.

Remember to always test thoroughly in a development environment before deploying custom forms to production, and maintain proper version control of your .xdp files.