@@ -308,9 +308,78 @@ def addAttachment(self, fname, fdata):
308308 # Update the root
309309 self ._root_object .update ({
310310 NameObject ("/Names" ): embeddedFilesDictionary
311- })
312-
313-
311+ })
312+
313+ def appendPagesFromReader (self , reader , after_page_append = None ):
314+ """
315+ Copy pages from reader to writer. Includes an optional callback parameter
316+ which is invoked after pages are appended to the writer.
317+
318+ :param reader: a PdfFileReader object from which to copy page
319+ annotations to this writer object. The writer's annots
320+ will then be updated
321+ :callback after_page_append (function): Callback function that is invoked after
322+ each page is appended to the writer. Callback signature:
323+
324+ :param writer_pageref (PDF page reference): Reference to the page
325+ appended to the writer.
326+ """
327+ # Get page count from writer and reader
328+ reader_num_pages = reader .getNumPages ()
329+ writer_num_pages = self .getNumPages ()
330+
331+ # Copy pages from reader to writer
332+ for rpagenum in range (0 , reader_num_pages ):
333+ reader_page = reader .getPage (rpagenum )
334+ self .addPage (reader_page )
335+ writer_page = self .getPage (writer_num_pages + rpagenum )
336+ # Trigger callback, pass writer page as parameter
337+ if callable (after_page_append ): after_page_append (writer_page )
338+
339+ def updatePageFormFieldValues (self , page , fields ):
340+ '''
341+ Update the form field values for a given page from a fields dictionary.
342+ Copy field texts and values from fields to page.
343+
344+ :param page: Page reference from PDF writer where the annotations
345+ and field data will be updated.
346+ :param fields: a Python dictionary of field names (/T) and text
347+ values (/V)
348+ '''
349+ # Iterate through pages, update field values
350+ for j in range (0 , len (page ['/Annots' ])):
351+ writer_annot = page ['/Annots' ][j ].getObject ()
352+ for field in fields :
353+ if writer_annot .get ('/T' ) == field :
354+ writer_annot .update ({
355+ NameObject ("/V" ): TextStringObject (fields [field ])
356+ })
357+
358+ def cloneReaderDocumentRoot (self , reader ):
359+ '''
360+ Copy the reader document root to the writer.
361+
362+ :param reader: PdfFileReader from the document root should be copied.
363+ :callback after_page_append
364+ '''
365+ self ._root_object = reader .trailer ['/Root' ]
366+
367+ def cloneDocumentFromReader (self , reader , after_page_append = None ):
368+ '''
369+ Create a copy (clone) of a document from a PDF file reader
370+
371+ :param reader: PDF file reader instance from which the clone
372+ should be created.
373+ :callback after_page_append (function): Callback function that is invoked after
374+ each page is appended to the writer. Signature includes a reference to the
375+ appended page (delegates to appendPagesFromReader). Callback signature:
376+
377+ :param writer_pageref (PDF page reference): Reference to the page just
378+ appended to the document.
379+ '''
380+ self .cloneReaderDocumentRoot (reader )
381+ self .appendPagesFromReader (reader , after_page_append )
382+
314383 def encrypt (self , user_pwd , owner_pwd = None , use_128bit = True ):
315384 """
316385 Encrypt this PDF file with the PDF Standard encryption handler.
0 commit comments