Back to Blog

    Developer Blog

    Programmatically impose multiple pages on one page (imposition)

    Foxit Quick PDF Library

    There is not a single “imposition” function in Foxit Quick PDF Library but it’s easy to use the CapturePage and DrawCapturedPage functions to do the imposition. There is some sample code below that demonstrates how to take a few different PDFs, merge them together, and then impose each page onto one page in a new document. The sample is written in Delphi, but should be easy enough to understand for users of other languages.

    unit ImpoDemo;
    interface
    
    uses
    Windows, Messages, SysUtils, Classes, Controls, Forms,
    Dialogs, ComCtrls, StdCtrls, DebenuPDFLibrary1113, ExtCtrls;
    
    type
    TfrmDemo = class(TForm)
    PanControl: TPanel;
    BtnCreatePage: TButton;
    StaticText2: TStaticText;
    ImpositionScrollBox: TScrollBox;
    Memo1: TMemo;
    Label1: TLabel;
    procedure BtnCreatePageClick(Sender: TObject);
    private
    public
    { Public declarations }
    end;
    
    var
    frmDemo: TfrmDemo;
    
    implementation
    {$R *.dfm}
    
    procedure TfrmDemo.BtnCreatePageClick(Sender: TObject);
    type
    ObjRec=record // description of imposition-object
    id: integer; // page-id
    w, h: double; // size
    end;
    var
    PDFLib: TDebenuPDFLibrary1113;
    Counter: integer;
    posx, posy: double; // left, bottom
    dimx, dimy: double; // sheet size
    w, h: double;
    i, j: integer;
    capt:array of ObjRec;
    begin
    PDFLib := TDebenuPDFLibrary1113.Create;
    if PDFLib.UnlockKey('...add_license_key_here...') = 1
    then begin
    // Quelldateien laden
    PDFLib.AddToFileList('List', 'tiger_emf.pdf');
    PDFLib.AddToFileList('List', 'debenu final tm.pdf');
    // workfile
    PDFLib.MergeFileList('List', '_temp.PDF');
    PDFLib.LoadFromFile('_temp.PDF');
    PDFLib.SetMeasurementUnits(1); // millimeters
    
    DeleteFile('_temp.PDF');
    Counter := PDFLib.PageCount; // PageCount is number of objects
    SetLength(capt, Counter); // make the array
    for i:=0 to Counter-1
    do begin // get the sizes from Mediabox
    StaticText2.Caption := IntToStr(i);
    capt[i].w := PDFLib.GetPageBox(1,2);
    capt[i].h := PDFLib.GetPageBox(1,3);
    capt[i].id := PDFLib.CapturePage(1); // from the top
    // to see the values
    Memo1.Lines.Add(Format('%d: %fx%f (%d)',[i, capt[i].w, capt[i].h, capt[i].id]));
    if (PDFLib.PageCount=1) then PDFLib.NewPage; // never empty
    end;
    // imposition
    PDFLib.SelectPage(1);
    dimx := 600;
    dimy := 400;
    PDFLib.SetPageDimensions(dimx, dimy); // size for output
    
    Memo1.Lines.Add('');
    posx := 5; // left border 5mm
    posy := 5;
    for i:=0 to Length(capt)-1 // every object as often as possible in a line
    do begin
    StaticText2.Caption := IntToStr(i+1);
    w := capt[i].w;
    h := capt[i].h;
    j := 1;
    while (posx + w < dimx-5)
    do begin
    PDFLib.DrawCapturedPage(capt[i].id, posx, posy+h, w, h);
    Memo1.Lines.Add(Format('object %d as %fx%f',[i+1, w, h]));
    posx := posx + w+10; // distance between objects
    w := w*j/(j+1); // more and more less
    h := h*j/(j+1);
    inc(j);
    end;
    posy := posy + capt[i].h+10;
    posx := 5; // left border 5mm
    end;
    
    // Delete the extra page that was created when the original pages were captured
    PDFLib.DeletePages(PDFLib.PageCount(), 1);
    // Save our work
    PDFLib.SaveToFile('debenu_quick_pdf_library_imposition.pdf');
    end
    else ShowMessage('Sorry, but the license key you provided could not be validated.');
    end;
    
    end.
    

    This article refers to a deprecated product. If you are looking for support for Foxit PDF SDK, please click here.