[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