def savePagesAsPdf(self, pageNumbers, fileName): "Saves the named pages into file of given name" (names, pickledData) = storeFormsInMemory(self.rawContent, pagenumbers=pageNumbers, prefix="page", BBoxes=0, extractText=0, fformname=None) (x,y,w,h) = self.getPageSize(0) c = reportlab.pdfgen.canvas.Canvas(fileName,pagesize=(w-x,h-y)) restoreFormsInMemory(pickledData, c) for pageNo in pageNumbers: c.doForm('page%d' % pageNo) c.showPage() # check the rotation and try to preserve it #rot = self.getPageRotation(pageNo) #if rot: # c._doc.Pages[-1].Rotate = rot c.save()
def loadPdf(filename, canvas, pageNumbers=None, prefix=None): if prefix is None: prefix = os.path.splitext(filename)[0] + '_page' prefix = prefix.replace('/','_') pdfContent = open(filename,"rb").read() (formNames, stuff) = storeFormsInMemory(pdfContent, pagenumbers=pageNumbers, prefix=prefix, all=1) if pageNumbers: namesToInclude = [] for num in pageNumbers: namesToInclude.append(formNames[num]) else: namesToInclude = None restoreFormsInMemory(stuff, canvas, allowDuplicates=1, formnames=namesToInclude) return formNames
def process_pdf(c,infn,prefix='PageForms'): from rlextra.pageCatcher import pageCatcher names, data = pageCatcher.storeFormsInMemory(open(infn,'rb').read(),prefix=prefix,all=1) names = pageCatcher.restoreFormsInMemory(data,c) del data for i in xrange(len(names)): thisname = names[i] c.saveState() c.translate(bleedX,bleedY) c.doForm(thisname) c.restoreState() c.showPage()
def loadPdf(filename, canvas, pageNumbers=None, prefix=None): if prefix is None: prefix = os.path.splitext(filename)[0] + '_page' prefix = prefix.replace('/', '_') pdfContent = open(filename, "rb").read() (formNames, stuff) = storeFormsInMemory(pdfContent, pagenumbers=pageNumbers, prefix=prefix, all=1) if pageNumbers: namesToInclude = [] for num in pageNumbers: namesToInclude.append(formNames[num]) else: namesToInclude = None restoreFormsInMemory(stuff, canvas, allowDuplicates=1, formnames=namesToInclude) return formNames
def encryptPdfInMemory(inputPDF, userPassword, ownerPassword=None, canPrint=1, canModify=1, canCopy=1, canAnnotate=1, strength=40): """accepts a PDF file 'as a byte array in memory'; return encrypted one. This is a high level convenience and does not touch the hard disk in any way. If you are encrypting the same file over and over again, it's better to use pageCatcher and cache the results.""" try: from rlextra.pageCatcher.pageCatcher import storeFormsInMemory, restoreFormsInMemory except ImportError: raise ImportError( '''reportlab.lib.pdfencrypt.encryptPdfInMemory failed because rlextra cannot be imported. See https://www.reportlab.com/downloads''') (bboxInfo, pickledForms) = storeFormsInMemory(inputPDF, all=1, BBoxes=1) names = list(bboxInfo.keys()) firstPageSize = bboxInfo['PageForms0'][2:] #now make a new PDF document buf = getBytesIO() canv = Canvas(buf, pagesize=firstPageSize) # set a standard ID while debugging if CLOBBERID: canv._doc._ID = "[(xxxxxxxxxxxxxxxx)(xxxxxxxxxxxxxxxx)]" formNames = restoreFormsInMemory(pickledForms, canv) for formName in formNames: canv.setPageSize(bboxInfo[formName][2:]) canv.doForm(formName) canv.showPage() encryptCanvas(canv, userPassword, ownerPassword, canPrint, canModify, canCopy, canAnnotate, strength=strength) canv.save() return buf.getvalue()
def drawFigure(self): if not self.canv.hasForm(self.formName): if self.filename in self._cache: f,data = self._cache[self.filename] else: f = open(self.filename,'rb') pdf = f.read() f.close() f, data = storeFormsInMemory(pdf, pagenumbers=[self.pageNo], prefix=self.prefix) if self.caching=='memory': self._cache[self.filename] = f, data f = restoreFormsInMemory(data, self.canv) self.canv.saveState() self.canv.scale(self._scaleFactor, self._scaleFactor) self.canv.doForm(self.formName) self.canv.restoreState()
def encryptPdfInMemory(inputPDF, userPassword, ownerPassword=None, canPrint=1, canModify=1, canCopy=1, canAnnotate=1, strength=40): """accepts a PDF file 'as a byte array in memory'; return encrypted one. This is a high level convenience and does not touch the hard disk in any way. If you are encrypting the same file over and over again, it's better to use pageCatcher and cache the results.""" try: from rlextra.pageCatcher.pageCatcher import storeFormsInMemory, restoreFormsInMemory except ImportError: raise ImportError('''reportlab.lib.pdfencrypt.encryptPdfInMemory failed because rlextra cannot be imported. See http://developer.reportlab.com''') (bboxInfo, pickledForms) = storeFormsInMemory(inputPDF, all=1, BBoxes=1) names = bboxInfo.keys() firstPageSize = bboxInfo['PageForms0'][2:] #now make a new PDF document buf = getStringIO() canv = Canvas(buf, pagesize=firstPageSize) # set a standard ID while debugging if CLOBBERID: canv._doc._ID = "[(xxxxxxxxxxxxxxxx)(xxxxxxxxxxxxxxxx)]" encryptCanvas(canv, userPassword, ownerPassword, canPrint, canModify, canCopy, canAnnotate, strength=strength) formNames = restoreFormsInMemory(pickledForms, canv) for formName in formNames: #need to extract page size in future canv.doForm(formName) canv.showPage() canv.save() return buf.getvalue()
def rewrite(self, outFileName): """Rewrite PDF, optionally with user decoration This will create a new PDF file from the existing one. It attempts to take care of rotated and cropped input files, and always outputs a file with no page-rotation and width the width and height you would normally expect. To decorate a page (e.g. overprint a timestamp), subclass PdfExplorer, and implement the rewritePage method: def rewritePage(self, pageNo, canvas, width, height): #your code here Take care to use the passed-in width and height, which will have been corrected by rotation and crop box. """ pageNumbers = list(range(self.pageCount)) (names, pickledData) = storeFormsInMemory(self.rawContent, pagenumbers=pageNumbers, prefix="page", BBoxes=0, extractText=0, fformname=None) c = reportlab.pdfgen.canvas.Canvas(outFileName) restoreFormsInMemory(pickledData, c) for pageNo in pageNumbers: (x,y,w,h) = self.getPageSize(0) rot = self.getPageRotation(pageNo) if rot in [90, 270]: w, h = h, w #go dumpster diving in the PDF and try to correct for #the bounds, which can otherwise clip off the content. #Ideally PageCatcher itself would do this when #reading in a rotated/cropped document, but I cannot #get that to work yet. formName = xObjectName(names[pageNo]) form = c._doc.idToObject[formName] form.uppery, form.upperx = form.upperx, form.uppery #if a crop box is set, the user originally 'saw' #a window onto the page specified by an extra box in the #PDF with (x1, y1, x2, y2) coords. We need to shift #our underlying form across try: cropBox = self.getCropBox(pageNo) except KeyError: cropBox = None if cropBox: if rot in [90, 270]: cropY1, cropX1, cropY2, cropX2 = cropBox else: cropX1, cropY1, cropX2, cropY2 = cropBox h = cropY2 - cropY1 w = cropX2 - cropX1 c.setPageSize((w,h)) #user hook - subclass this to overprint c.saveState() self.rewriteUnderPage(pageNo, c, w, h) c.restoreState() c.saveState() if cropBox: c.translate(-cropX1, -cropY1) c.doForm('page%d' % pageNo) c.restoreState() #user hook - subclass this to overprint self.rewritePage(pageNo, c, w, h) #save it c.showPage() c.save()