def copy_page(page): newpage = PageObject(page.pdf) newpage.update(page) # Copy Rectangles to be manipulatable for attr in PAGE_BOXES: if page.has_key(attr): newpage[NameObject(attr)] = RectangleObject(list(page[attr])) return newpage
def copy_page(page): newpage = PageObject(page.pdf) newpage.update(page) # Copy Rectangles to be manipulatable for attr in PAGE_BOXES: if page.has_key(attr): newpage[NameObject(attr)] = RectangleObject(list(page[attr])) return newpage
def slice(self, ifile, ofile=None, marginv=0, marginh=0, columnwidth=0, centerwidth=0, scale=0.9): output = PdfFileWriter() input = PdfFileReader(file(ifile, "rb")) # print the title of document1.pdf print "title = %s" % (input.getDocumentInfo().title) print "Processing page: " for i in xrange(input.getNumPages()): print i+1 # add left column as page page = PageObject.createBlankPage(input) page.mergePage(input.getPage(i)) if columnwidth != 0 and centerwidth != 0: page.mediaBox.upperRight = ( page.mediaBox.getUpperLeft_x() + marginh + columnwidth, page.mediaBox.getUpperRight_y() - marginv ) else: page.mediaBox.upperRight = ( page.mediaBox.getUpperRight_x() / 2, page.mediaBox.getUpperRight_y() - marginv ) page.mediaBox.lowerLeft = ( page.mediaBox.getLowerLeft_x() + marginh, page.mediaBox.getLowerLeft_y() + marginv, ) page.scale(scale, scale) output.addPage(page) # add right column as page page = PageObject.createBlankPage(input) page.mergePage(input.getPage(i)) if columnwidth != 0 and centerwidth != 0: page.mediaBox.lowerLeft = ( page.mediaBox.getLowerLeft_x() + marginh + columnwidth + centerwidth, page.mediaBox.getLowerLeft_y() + marginv, ) else: page.mediaBox.lowerLeft = ( page.mediaBox.getUpperRight_x() / 2, page.mediaBox.getLowerLeft_y() + marginv, ) page.mediaBox.upperRight = ( page.mediaBox.getUpperRight_x() - marginh, page.mediaBox.getUpperRight_y() - marginv ) page.scale(scale, scale) output.addPage(page) # finally, write "output" if ofile is not None: outputStream = file(ofile, "wb") else: outputStream = file(PdfSlicer.getOutName(ifile), "wb") output.write(outputStream) outputStream.close()
def generate_files(self, pages, front_side_pages, back_side_pages): """ scale each two pages to fit into one sheet, construct the document and write out two files: the front side and the back side files. """ front_output = PdfFileWriter() back_output = PdfFileWriter() size = 841 / 2 num_pages = pages.getNumPages() for index, page in enumerate(front_side_pages): #(w, h) = page_model.mediaBox.upperRight page_model = PageObject.createBlankPage(width=841, height=595) page_model.mergeScaledTranslatedPage(pages.getPage(page[0]), tx=0, ty=0, scale=0.7) page_model.mergeScaledTranslatedPage(pages.getPage(page[1]), tx=size, ty=0, scale=0.7) front_output.addPage(page_model) ProgressStatus.message = "Processing front pages ... (%s of %s)" % (index, num_pages / 4) ProgressStatus.percentage = float(index) / float(pages.getNumPages() / 4) * 50 if self.exiting: return for index, page in enumerate(back_side_pages): page_model = PageObject.createBlankPage(width=841, height=595) page_model.mergeScaledTranslatedPage(pages.getPage(page[0]), tx=0, ty=0, scale=0.7) page_model.mergeScaledTranslatedPage(pages.getPage(page[1]), tx=size, ty=0, scale=0.7) back_output.addPage(page_model) ProgressStatus.message = "Processing back pages ... (%s of %s)" % (index, num_pages / 4) ProgressStatus.percentage = float(index) / float(pages.getNumPages() / 4) * 50 + 50 if self.exiting: return with file(path.join(self.job.directory, "(front_side_pages) " + path.basename(self.job.pdf_file)), "wb") as stream: ProgressStatus.message = "Writing files..." front_output.write(stream) with file(path.join(self.job.directory, "(back_side_pages) " + path.basename(self.job.pdf_file)), "wb") as stream: ProgressStatus.message = "Writing files..." back_output.write(stream) ProgressStatus.message = "Finished" ProgressStatus.percentage = 100
def replace_text(cls, page, text, replace): # HACK from pyPdf.pdf import ContentStream, PageObject from pyPdf.generic import TextStringObject, NameObject content = ContentStream(page["/Contents"].getObject(), page.pdf) for idx in range(len(content.operations)): operands, operator = content.operations[idx] if operator == 'Tj': operands[0] = TextStringObject(operands[0].replace( text, replace)) new_page = PageObject.createBlankPage(page.pdf) new_page.mergePage(page) new_page[NameObject('/Contents')] = content return new_page
def replace_text(cls, page, text, replace): # HACK from pyPdf.pdf import ContentStream, PageObject from pyPdf.generic import TextStringObject, NameObject content = ContentStream(page["/Contents"].getObject(), page.pdf) for idx in range(len(content.operations)): operands, operator = content.operations[idx] if operator == 'Tj': operands[0] = TextStringObject(operands[0].replace(text, replace)) new_page = PageObject.createBlankPage(page.pdf) new_page.mergePage(page) new_page[NameObject('/Contents')] = content return new_page
def n_pages_on_one(pages, pages_sheet): width = float(pages[0].mediaBox.getWidth()) height = float(pages[0].mediaBox.getHeight()) # Calculate placement parameters rotation, scaling, cell_x_count, cell_y_count = _get_optimal_placement( width, height, pages_sheet) # Get placement matrix, ajust to rotation if rotation: # From down to up, left to right # Also ajust to "one-off issue" placement = list(product(range(1, cell_x_count+1), range(cell_y_count-1, -1, -1))) else: # From left to right, up to down placement = map(lambda (x, y): (y, x), list(product(range(cell_y_count), range(cell_x_count)))) new_pages = [] # Merge pages for new_page_idx in range(int(math.ceil(1. * len(pages) / pages_sheet))): offset = new_page_idx * pages_sheet # Start from blank page new_page = PageObject.createBlankPage(None, width, height) # Get `pages_sheet` number of pages and merge together for idx, page in enumerate(pages[offset:offset+pages_sheet]): x, y = placement[idx] # Get coordinates w = width * x / cell_x_count h = height * (y+1) / cell_y_count # TODO align page so that it takes the center of its cell new_page.mergeRotatedScaledTranslatedPage(page, rotation, scaling, w, height-h) new_pages.append(new_page) return new_pages
def analyze_webletter(self, pdf_letter): """ Look if the web letter has a minimum of 2 page. If not add one blank page. """ pdf = PdfFileReader(BytesIO(pdf_letter)) if pdf.numPages < 2: final_pdf = PdfFileWriter() final_pdf.addPage(pdf.getPage(0)) width = float(pdf.getPage(0).mediaBox.getWidth()) height = float(pdf.getPage(0).mediaBox.getHeight()) new_page = PageObject.createBlankPage(None, width, height) final_pdf.addPage(new_page) output_stream = BytesIO() final_pdf.write(output_stream) output_stream.seek(0) pdf_letter = output_stream.read() output_stream.close() return pdf_letter
def analyze_webletter(self, pdf_letter): """ Look if the web letter has a minimum of 2 page. If not add one blank page. """ pdf = PdfFileReader(BytesIO(pdf_letter)) if pdf.numPages < 2: final_pdf = PdfFileWriter() final_pdf.addPage(pdf.getPage(0)) width = float(pdf.getPage(0).mediaBox.getWidth()) height = float(pdf.getPage(0).mediaBox.getHeight()) new_page = PageObject.createBlankPage(None, width, height) final_pdf.addPage(new_page) output_stream = BytesIO() final_pdf.write(output_stream) output_stream.seek(0) pdf_letter = output_stream.read() output_stream.close() return pdf_letter
def generate_files(self, pages, front_side_pages, back_side_pages): """ scale each two pages to fit into one sheet, construct the document and write out two files: the front side and the back side files. """ front_output = PdfFileWriter() back_output = PdfFileWriter() size = 841 / 2 num_pages = pages.getNumPages() for index, page in enumerate(front_side_pages): #(w, h) = page_model.mediaBox.upperRight page_model = PageObject.createBlankPage(width=841, height=595) page_model.mergeScaledTranslatedPage(pages.getPage(page[0]), tx=0, ty=0, scale=0.7) page_model.mergeScaledTranslatedPage(pages.getPage(page[1]), tx=size, ty=0, scale=0.7) front_output.addPage(page_model) ProgressStatus.message = "Processing front pages ... (%s of %s)" % ( index, num_pages / 4) ProgressStatus.percentage = float(index) / float( pages.getNumPages() / 4) * 50 if self.exiting: return for index, page in enumerate(back_side_pages): page_model = PageObject.createBlankPage(width=841, height=595) page_model.mergeScaledTranslatedPage(pages.getPage(page[0]), tx=0, ty=0, scale=0.7) page_model.mergeScaledTranslatedPage(pages.getPage(page[1]), tx=size, ty=0, scale=0.7) back_output.addPage(page_model) ProgressStatus.message = "Processing back pages ... (%s of %s)" % ( index, num_pages / 4) ProgressStatus.percentage = float(index) / float( pages.getNumPages() / 4) * 50 + 50 if self.exiting: return with file( path.join( self.job.directory, "(front_side_pages) " + path.basename(self.job.pdf_file)), "wb") as stream: ProgressStatus.message = "Writing files..." front_output.write(stream) with file( path.join( self.job.directory, "(back_side_pages) " + path.basename(self.job.pdf_file)), "wb") as stream: ProgressStatus.message = "Writing files..." back_output.write(stream) ProgressStatus.message = "Finished" ProgressStatus.percentage = 100
def copyPage(page): newpage = PageObject(page.pdf) newpage.update(page) newpage[NameObject("/CropBox")] = RectangleObject(page.cropBox) return newpage
#!/usr/bin/env python from pyPdf import PdfFileWriter, PdfFileReader from pyPdf.pdf import PageObject input1 = PdfFileReader(open('page1.pdf', 'rb')) page1 = input1.getPage(0) width, height = (page1.mediaBox.getWidth(), page1.mediaBox.getHeight()) output = PdfFileWriter() for i in range(10): page = PageObject.createBlankPage(None, width, height) page.mergeScaledTranslatedPage(page1, 0.5, 0, 0) page.mergeScaledTranslatedPage(page1, 0.5, width/2, height/2) page.mergeScaledTranslatedPage(page1, 0.5, 0, height/2) page.mergeScaledTranslatedPage(page1, 0.5, width/2, 0) output.addPage(page) outputStream = open('output.pdf', 'wb') output.write(outputStream) outputStream.close()
def copyPage(page): newpage = PageObject(page.pdf) newpage.update(page) newpage[NameObject("/CropBox")] = RectangleObject(page.cropBox) return newpage