[reportlab-users] [PyPDF] I would like merge two A4 PDF documents in PDF document with A4 size + 10 mm (width + 10mm, height + 10mm)

KLEIN Stéphane stephane at harobed.org
Fri Mar 27 06:25:43 EDT 2009


Le Fri, 27 Mar 2009 10:10:34 +0000, KLEIN Stéphane a écrit :


> Le Thu, 26 Mar 2009 15:51:02 +0000, KLEIN Stéphane a écrit :

>

>> Hi,

>>

>> To summarize, with PyPDF package, I would like merge two A4 PDF

>> documents in PDF document with A4 size + 10 mm (width + 10mm, height +

>> 10mm).

>>

>> First, I merge two PDF pages with this code :

>>

>> ::

>>

>> outputStream = file("output.pdf", "w") output = PdfFileWriter()

>>

>> background_pages = PdfFileReader(file("background.pdf", "rb"))

>> foreground_pages = PdfFileReader(file("foreground.pdf", "rb"))

>>

>> bg_page0 = background_pages.getPage(0) fg_page0 =

>> foreground_pages.getPage(0)

>>

>> bg_page0.mergePage( fg_page0 )

>>

>> output.addPage(page0)

>>

>> output.write(outputStream)

>> outputStream.close()

>>

>> This works greatly.

>>

>> Background and foreground PDF documents size are A4 (paper size).

>>

>> From this point, I would like :

>>

>> 1. create an empty page with this paper size : A4 width + 10 mm, A4

>> height + 10 mm

>> 2. merge and center background page in current page (page create at

>> step 1)

>> 3. merge and center foreground page

>>

>> I don't know :

>>

>> * how to change page size ?

>> * how to merge and center page ?

>

> I found a solution to "translate" a page :

>

> ::

>

> from reportlab.lib.units import mm

> import pyPdf

>

> def translate_pdf_page(page, delta_x, delta_y):

> content = pyPdf.pdf.ContentStream(page["/Contents"].getObject(),

> page.pdf)

> content.operations.insert(0, [[], '1 0 0 1 %s %s cm' %

> (delta_x,delta_y)] )

> page[pyPdf.generic.NameObject('/Contents')] = content

>

> outputStream = file("output.pdf", "w") output =

> pyPdf.pdf.PdfFileWriter()

>

> background_pages = pyPdf.pdf.PdfFileReader(file("background.pdf",

> "rb"))

> foreground_pages = pyPdf.pdf.PdfFileReader(file("foreground.pdf",

> "rb"))

>

> bg_page0 = background_pages.getPage(0) fg_page0 =

> foreground_pages.getPage(0)

>

> translate_pdf_page(fg_page0, 5 * mm, 5 * mm)

>

> bg_page0.mergePage( fg_page0 )

>

> output.addPage(bg_page0)

>

> output.write(outputStream)

> outputStream.close()



Now, I've another function to add some marges to page :


::


PAGE_BOXES = ("/MediaBox", "/CropBox", "/BleedBox", "/TrimBox", "/
ArtBox")

def add_marges(page, top, right, bottom, left):
for boxname in PAGE_BOXES:
if not page.get(boxname):
continue
box = pyPdf.pdf.getRectangle(page, boxname, None)
box.upperRight = (
float(box.upperRight[0]) + right + left,
float(box.upperRight[1]) + top + bottom
)
translate_pdf_page(page, left, bottom)

I can add some marging (the size) to bg_page0, example :


::


bg_page0 = background_pages.getPage(0) fg_page0 =
foreground_pages.getPage(0)

translate_pdf_page(fg_page0, 5 * mm, 5 * mm)

bg_page0.mergePage( fg_page0 )

add_marges(bg_page0, 20 *mm, 20*mm, 10 * mm, 10 * mm)

output.addPage(bg_page0)

output.write(outputStream)
outputStream.close()

Regards,
Stephane



More information about the reportlab-users mailing list