Swap page order of a PDF using 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 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 1
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_ROTATION 0
Set SLOT_DEF_PLACEMENT 'CC'
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:
- "write" this data as an available Sheet definition
- create a new Sheet based on this Sheet definition
- create a Slot on this page (named "1")
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):
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).
The RunList ends here and will automatically start again after "
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.