Dynamic imposition

Using dynamic imposition, various aspects of the PDF to be imposed can be determined and used to control the imposition process.
In the first part of this article, the task is to reverse the page order of the document. As the input document may have different page sizes, the size of each output page will be adjusted accordingly. Also, existing TrimBoxes will be restored in the resulting document.

You'll lalso find an example, how to move the first page to the end of the document, while maintaining the order of the other pages.

The last part is an example for a full dynamic Step and Repeat imposition scheme with many comments and explanations in the code.

The content of the SheetConfig isn't used in both cases, as the sizes of Sheet and Slot will be defined during runtime by the RunList. But as the Impose engine requires the presence of a SheetConfig (as it can not be determined at the beginning of the imposition processing if there will be sheets and slots created by the RunList), it make sense to use a simple version of this config file.

Introducing 2 variables to work with

During normal impositioning, the processing ends as soon as the value of "FirstPage" becomes bigger than the value of the "LastPage". But as the last page has to be positioned as the first page, working with these tokens could become difficult. Therefore 2 new counters/variables are introduced at the beginning and set to the value of the "LastPage" which will be positioned as the first page:

# Set current page:
Set	Counter1	var('LastPage')
Set	i	var('LastPage')

Defining Sheets for every page to be positioned

As the possibilities to analyse the input file during runtime are limited while impositioning, we will just create a new, unique sheet for every page. So we start the "Loop" already at this point:


These created sheets will always have the dimension of the CropBox of the current page. We already set the variable "i" to "LastPage", so we can use the values of this page to define the MediaBox of the Sheet (which is actually the visible dimension after processing):

Set	SHEET_DEF_MEDIABOX_L   cropboxleft(var('i'))
Set	SHEET_DEF_MEDIABOX_B   cropboxbottom(var('i'))
Set	SHEET_DEF_MEDIABOX_W   cropboxwidth(var('i'))
Set	SHEET_DEF_MEDIABOX_H   cropboxheight(var('i'))

 As the pages may contain a TrimBox, we should take care that this Box as well as existing bleed are maintained. To achieve this, we first set the TrimBox of the Sheet to the values of the current page:

Set	SHEET_DEF_TRIMBOX_L	 trimboxleft(var('i'))
Set	SHEET_DEF_TRIMBOX_B	 trimboxbottom(var('i'))
Set	SHEET_DEF_TRIMBOX_W	 trimboxwidth(var('i'))
Set	SHEET_DEF_TRIMBOX_H	 trimboxheight(var('i'))

and afterwards, we also set the Slot (so the place where the page shall be positioned) to the TrimBox of the current page:

Set	SLOT_DEF_TRIMBOX_L   trimboxleft(var('i'))
Set	SLOT_DEF_TRIMBOX_B   trimboxbottom(var('i'))
Set	SLOT_DEF_TRIMBOX_W   trimboxwidth(var('i'))
Set	SLOT_DEF_TRIMBOX_H   trimboxheight(var('i'))

And to maintain existing bleed, we set the bleed for the Slot to the distance between CropBox and TrimBox for all 4 edges:

Set	SLOT_DEF_BLEED_L   trimboxleft(var('i')) - cropboxleft(var('i'))
Set	SLOT_DEF_BLEED_B   trimboxbottom(var('i')) - cropboxbottom(var('i'))
Set	SLOT_DEF_BLEED_R   cropboxright(var('i')) - trimboxright(var('i'))
Set	SLOT_DEF_BLEED_T   cropboxtop(var('i')) - trimboxtop(var('i'))

Now we are almost done with the definition of the Sheet and the Slot for the page to be positioned. We just have to take care that the page will be placed unrotated, centered and that no additional marks are added to the positioned content:

Set	SLOT_DEF_BindingMargin	'N'
Set	SLOT_DEF_CropMarkStyleLB	'N'
Set	SLOT_DEF_CropMarkStyleLT	'N'
Set	SLOT_DEF_CropMarkStyleRT	'N'
Set	SLOT_DEF_CropMarkStyleRB	'N'

The impositioning process

We have not defined the correct Sheet for the last page.
We now have to:

  1. "write" this data as an available Sheet definition
  2. create a new Sheet based on this Sheet definition
  3. create a Slot on this page (named "1")
SetSheet	var('i')
NewSheet	var('i')
MakeSlot	var('i')   1

We have already set the Variable "i" and the Token "Counter1" to the Value of "LastPage".
Now we are ready to place the page, which will be done with the page number stored in "Counter 1" (Variables can not be used to place a page):

PositionPage	Counter1	Slot_1

Now the last page is positioned and we have to prepare the used Variables and Tokens for the next Loop. Therefore we set the values for "i" and "Counter1" to the secont last page (last page - 1):

Decrement	Counter1
Set	i	var('i') - 1

To ensure that the processing is terminated after the first page as the last page in the new document, we also increase the Token for "FirstPage" by 1. As already mentioned: the processing will stop as soon as the (value of) "FirstPage" becomes greater than the (value of) "LastPage" (which remains to the real number of the last page during the whole imposition process).

Increment	FirstPage

The RunList ends here and will automatically start again after "Loop".
There, a new Sheet definition will be created which will then be used for the positioning of the second last page and so on...

Move first page to the end of the document

This sample is using a much more simple approach to place the first page at the end of the document.

Step and Repeat imposition scheme

This sample creates a new sheet for each page in the input file where the size of the sheet is determined from the TrimBox of the current page and the number of slots, the gaps between and the border around the slots.