def merge_pdf(new_filename, pdfs, encryp=False, user_pw="", owner_pw=None, lvl=128): """ Merges pdfs into one pdf called new_filename. pdf: list of tuples (path=string, password=string) """ output = PdfFileWriter() for path, pw in pdfs: pdf = PdfFileReader(open(path, "rb")) if pdf.isEncrypted: decryption = pdf.decrypt(pw) if decryption == 0: raise PasswordError for page_num in range(pdf.getNumPages()): page = pdf.getPage(page_num) output.addPage(page) with file(new_filename, "wb") as outputStream: outputStream = open(new_filename, "wb") if encryp and lvl == 128: output.encrypt(user_pw, owner_pw, True) elif encryp: output.encrypt(user_pw, owner_pw, False) output.write(outputStream)
def protect(ifname, ofname, password): with open(ifname, "rb") as ifile, open(ofname, "wb") as ofile: reader = PdfFileReader(ifile) writer = PdfFileWriter() for i in range(reader.getNumPages()): writer.addPage(reader.getPage(i)) writer.encrypt(password) writer.write(ofile)
def create(self): """ Create PDF """ print "[+] The password is " + self.password writer = PdfFileWriter() input_pdf = PdfFileReader(file(self.filename, "rb")) for page in range(0, input_pdf.getNumPages()): writer.addPage(input_pdf.getPage(page)) output_stream = file(self.outputname, "wb") writer.encrypt(self.password, use_128bit=True) #max security by lib writer.write(output_stream) output_stream.close() print "[+] Done"
def encrypt(pdf_path, out_path, password, metadata=None): if metadata == None: title = _('Unknown') author = _('Unknown') else: title = metadata.title author = authors_to_string(metadata.authors) out_pdf = PdfFileWriter(title=title, author=author) pdf = PdfFileReader(open(os.path.abspath(pdf_path), 'rb')) for page in pdf.pages: out_pdf.addPage(page) with open(out_path, 'wb') as out_file: out_pdf.encrypt(str(password)) out_pdf.write(out_file)
def __encrypt_pdf(self, name_in, name_out, user_key, owner_key): """Encrypt a PDF file with both a user key and an owner key.""" pdf_writer = PdfFileWriter() pdf_reader = PdfFileReader(open(name_in, "rb")) # Metadata copy hack see: # http://stackoverflow.com/questions/2574676/change-metadata-of-pdf-file-with-pypdf metadata = pdf_reader.getDocumentInfo() pdf_writer._info.getObject().update(metadata) # Copy metadata to dest for i in xrange(pdf_reader.getNumPages()): pdf_writer.addPage(pdf_reader.getPage(i)) pdf_writer.encrypt(user_pwd=user_key, owner_pwd=owner_key.encode("ascii")) with file(name_out, "wb") as f: pdf_writer.write(f)
import sys from pyPdf import PdfFileReader, PdfFileWriter if len(sys.argv) is not 4: print("Example:") print("python %s input.pdf output.pdf password" % __file__) exit(0) input_file = sys.argv[1] output_file = sys.argv[2] password = sys.argv[3] with open(input_file, "rb") as pdf: reader = PdfFileReader(pdf) if reader.isEncrypted: reader.decrypt('') writer = PdfFileWriter() for i in range(reader.getNumPages()): writer.addPage(reader.getPage(i)) with open(output_file, "wb") as outputStream: writer.encrypt(password) writer.write(outputStream) outputStream.close()
def export_to_file(self, file_out, only_selected=False): """Export to file""" selection = self.iconview.get_selected_items() pdf_output = PdfFileWriter() pdf_input = [] for pdfdoc in self.pdfqueue: pdfdoc_inp = PdfFileReader(file(pdfdoc.copyname, 'rb')) if pdfdoc_inp.getIsEncrypted(): try: # Workaround for lp:#355479 stat = pdfdoc_inp.decrypt('') except: stat = 0 if (stat != 1): errmsg = _('File %s is encrypted.\n' 'Support for encrypted files has not been implemented yet.\n' 'File export failed.') % pdfdoc.filename raise Exception, errmsg # FIXME # else # ask for password and decrypt file pdf_input.append(pdfdoc_inp) for row in self.model: if only_selected and row.path not in selection: continue # add pages from input to output document nfile = row[2] npage = row[3] current_page = copy(pdf_input[nfile - 1].getPage(npage - 1)) angle = row[6] angle0 = current_page.get("/Rotate", 0) crop = [row[7], row[8], row[9], row[10]] if angle != 0: current_page.rotateClockwise(angle) if crop != [0., 0., 0., 0.]: rotate_times = (((angle + angle0) % 360 + 45) / 90) % 4 crop_init = crop if rotate_times != 0: perm = [0, 2, 1, 3] for it in range(rotate_times): perm.append(perm.pop(0)) perm.insert(1, perm.pop(2)) crop = [crop_init[perm[side]] for side in range(4)] # (x1, y1) = current_page.cropBox.lowerLeft # (x2, y2) = current_page.cropBox.upperRight (x1, y1) = [float(xy) for xy in current_page.mediaBox.lowerLeft] (x2, y2) = [float(xy) for xy in current_page.mediaBox.upperRight] x1_new = int(x1 + (x2 - x1) * crop[0]) x2_new = int(x2 - (x2 - x1) * crop[1]) y1_new = int(y1 + (y2 - y1) * crop[3]) y2_new = int(y2 - (y2 - y1) * crop[2]) # current_page.cropBox.lowerLeft = (x1_new, y1_new) # current_page.cropBox.upperRight = (x2_new, y2_new) current_page.mediaBox.lowerLeft = (x1_new, y1_new) current_page.mediaBox.upperRight = (x2_new, y2_new) pdf_output.addPage(current_page) #encrypting the file pdf_output.encrypt(self.getPassword()) #calling password function inside resultPdf = open(file_out, 'wb') pdf_output.write(resultPdf)
def concatenate(inpdfargs, outfileformat, inverse=False): global verbose global ownerpassword global userpassword output = PdfFileWriter() if userpassword or ownerpassword: output.encrypt(userpassword, ownerpassword) if outfileformat == '-': verbose = False for pdf, args in inpdfargs: numpages = pdf.getNumPages() replacements = [["end", str(numpages)]] pagequeue = getpagequeue(args, replacements) feedback = "**Processing: " + pdf.stream.name + " : " if inverse == False: if verbose: print(feedback + "Sel" + str(pagequeue)) for pageitem in pagequeue: page, angle = pageitem if ((page <= numpages) and (page > 0)): if verbose: print "---add p" + str(page) output.addPage( pdf.getPage(page - 1).rotateClockwise(angle)) else: sys.stderr.write("Page" + str(page) + " is not found in file" + pdf.stream.name) sys.qexit(3) #wrong pages or ranges else: pagelist = [] for pageitem in pagequeue: pagelist += [pageitem[0]] if verbose: print(feedback + "Rem" + str(pagelist[len(inputs) - 1])) for page in range(1, numpages + 1): if (page not in pagelist): if verbose: print "--add p" + str(page) output.addPage(pdf[-1].getPage(page - 1)) ###### filename formatting ###### outfilename = outfileformat replacementlist = [("%n", "%1n"), ("%e", "%1e")] applyreplacement = (lambda str, pair: str.replace(pair[0], pair[1])) applyreplacementlist = (lambda str, list=replacementlist, func= applyreplacement: reduce(func, [str] + list)) outfilename = applyreplacementlist(outfilename, replacementlist) namearg = re.search('%[0-9]*n', outfilename) if namearg: namearg = namearg.group() filenum = int(namearg.strip("%n")) (name, dot, ext) = inpdfargs[filenum - 1][0].stream.name.rpartition(".") outfilename = outfilename.replace(namearg, name) extarg = re.search('%[0-9]*e', outfilename) if extarg: extarg = extarg.group() filenum = int(extarg.strip("%e")) (name, dot, ext) = inpdfargs[filenum - 1][0].stream.name.rpartition(".") outfilename = outfilename.replace(extarg, ext) while os.path.exists(outfilename): if verbose: print('error: ' + outfilename + ' already exists... appending number') (oname, odot, oext) = outfilename.rpartition(".") outfilename = oname + "-1" + odot + oext ###### end filename formatting ###### outputStream = openpdf(outfilename, "out") if verbose: print "**Writing to " + outputStream.name output.write(outputStream) outputStream.close()
def collate(inpdfargs, outfileformat): global verbose global ownerpassword global userpassword output = PdfFileWriter() if userpassword or ownerpassword: output.encrypt(userpassword, ownerpassword) if outfileformat == '-': verbose = False pagequeues = [] maxpagecount = 0 for pdf, args in inpdfargs: numpages = pdf.getNumPages() if numpages > maxpagecount: maxpagecount = numpages replacements = [["end", str(numpages)]] pagequeues += [getpagequeue(args, replacements)] for pagei in range(maxpagecount): for pdfarg in inpdfargs: pdf, args = pdfarg pdfi = inpdfargs.index(pdfarg) numpages = pdf.getNumPages() try: page, angle = pagequeues[pdfi][pagei] except: page = -1 else: if ((page <= numpages) and (page > 0)): if verbose: print "---add " + pdf.stream.name + ":p" + str(page) output.addPage( pdf.getPage(page - 1).rotateClockwise(angle)) ###### filename formatting ###### outfilename = outfileformat replacementlist = [("%n", "%1n"), ("%e", "%1e")] applyreplacement = (lambda str, pair: str.replace(pair[0], pair[1])) applyreplacementlist = (lambda str, list=replacementlist, func= applyreplacement: reduce(func, [str] + list)) outfilename = applyreplacementlist(outfilename, replacementlist) namearg = re.search('%[0-9]+n', outfilename) if namearg: namearg = namearg.group() filenum = int(namearg.strip("%n")) (name, dot, ext) = inpdfargs[filenum - 1][0].stream.name.rpartition(".") outfilename = outfilename.replace(namearg, name) extarg = re.search('%[0-9]+e', outfilename) if extarg: extarg = extarg.group() filenum = int(extarg.strip("%e")) (name, dot, ext) = inpdfargs[filenum - 1][0].stream.name.rpartition(".") outfilename = outfilename.replace(extarg, ext) while os.path.exists(outfilename): if verbose: print('error: ' + outfilename + ' already exists... appending number') (oname, odot, oext) = outfilename.rpartition(".") outfilename = oname + "-1" + odot + oext ###### end filename formatting ###### outputStream = openpdf(outfilename, "out") if verbose: print "**Writing to " + outputStream.name output.write(outputStream) outputStream.close()
def burst(inpdfargs, outfileformat): global verbose global ownerpassword global userpassword i = 0 j = 0 for pdf, args in inpdfargs: numpages = pdf.getNumPages() replacements = [["end", str(numpages)]] pagequeue = getpagequeue(args, replacements) if verbose: print "**Processing: " + pdf.stream.name log10pages = int(math.ceil(math.log10(numpages))) (name, dot, ext) = pdf.stream.name.rpartition(".") for pageitem in pagequeue: page, angle = pageitem if ((page <= numpages) and (page > 0)): output = PdfFileWriter() if userpassword or ownerpassword: output.encrypt(userpassword, ownerpassword) output.addPage(pdf.getPage(page - 1).rotateClockwise(angle)) ###### filename formatting ###### outfilename = outfileformat replacementlist = [("%0p", "%0" + str(log10pages) + "p"), ("%n", name), ("%e", ext)] applyreplacement = ( lambda str, pair: str.replace(pair[0], pair[1])) applyreplacementlist = ( lambda str, list=replacementlist, func=applyreplacement: reduce(func, [str] + list)) outfilename = applyreplacementlist(outfilename, replacementlist) namearg = re.search('%[0-9]+n', outfilename) if namearg: namearg = namearg.group() filenum = int(namearg.strip("%n")) (name, dot, ext) = inpdfargs[filenum - 1][0].stream.name.rpartition(".") outfilename = outfilename.replace(namearg, name) extarg = re.search('%[0-9]+e', outfilename) if extarg: extarg = extarg.group() filenum = int(extarg.strip("%e")) (name, dot, ext) = inpdfargs[filenum - 1][0].stream.name.rpartition(".") outfilename = outfilename.replace(extarg, ext) if re.search('%[0-9]*i', outfilename): outfilename = outfilename % (j + 1) pmatch = re.search('%[0-9]*p', outfilename) if pmatch: outfilename = re.sub( '%[0-9]*p', (lambda smatch: smatch.group().replace("p", "i")), outfilename) % page while os.path.exists(outfilename): if verbose: print('error: ' + outfilename + ' already exists... appending number') (oname, odot, oext) = outfilename.rpartition(".") outfilename = oname + "-1" + odot + oext ###### end filename formatting ###### outputStream = openpdf(outfilename, "out") if verbose: print "--write p" + str(page) + ">>" + outputStream.name output.write(outputStream) outputStream.close() else: sys.stderr.write("Page" + str(page) + " is not found in file" + pdf.stream.name) sys.exit(3) #wrong pages or ranges j = j + 1 i = i + 1 if verbose: print(str(j) + " pages in " + str(i) + " files processed")
def export_to_file(self, file_out, only_selected=False): """Export to file""" selection = self.iconview.get_selected_items() pdf_output = PdfFileWriter() pdf_input = [] for pdfdoc in self.pdfqueue: pdfdoc_inp = PdfFileReader(file(pdfdoc.copyname, 'rb')) if pdfdoc_inp.getIsEncrypted(): try: # Workaround for lp:#355479 stat = pdfdoc_inp.decrypt('') except: stat = 0 if (stat != 1): errmsg = _( 'File %s is encrypted.\n' 'Support for encrypted files has not been implemented yet.\n' 'File export failed.') % pdfdoc.filename raise Exception, errmsg # FIXME # else # ask for password and decrypt file pdf_input.append(pdfdoc_inp) for row in self.model: if only_selected and row.path not in selection: continue # add pages from input to output document nfile = row[2] npage = row[3] current_page = copy(pdf_input[nfile - 1].getPage(npage - 1)) angle = row[6] angle0 = current_page.get("/Rotate", 0) crop = [row[7], row[8], row[9], row[10]] if angle != 0: current_page.rotateClockwise(angle) if crop != [0., 0., 0., 0.]: rotate_times = (((angle + angle0) % 360 + 45) / 90) % 4 crop_init = crop if rotate_times != 0: perm = [0, 2, 1, 3] for it in range(rotate_times): perm.append(perm.pop(0)) perm.insert(1, perm.pop(2)) crop = [crop_init[perm[side]] for side in range(4)] # (x1, y1) = current_page.cropBox.lowerLeft # (x2, y2) = current_page.cropBox.upperRight (x1, y1) = [float(xy) for xy in current_page.mediaBox.lowerLeft] (x2, y2) = [float(xy) for xy in current_page.mediaBox.upperRight] x1_new = int(x1 + (x2 - x1) * crop[0]) x2_new = int(x2 - (x2 - x1) * crop[1]) y1_new = int(y1 + (y2 - y1) * crop[3]) y2_new = int(y2 - (y2 - y1) * crop[2]) # current_page.cropBox.lowerLeft = (x1_new, y1_new) # current_page.cropBox.upperRight = (x2_new, y2_new) current_page.mediaBox.lowerLeft = (x1_new, y1_new) current_page.mediaBox.upperRight = (x2_new, y2_new) pdf_output.addPage(current_page) #encrypting the file pdf_output.encrypt( self.getPassword()) #calling password function inside resultPdf = open(file_out, 'wb') pdf_output.write(resultPdf)