예제 #1
0
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)
예제 #2
0
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)
예제 #3
0
파일: pdflock.py 프로젝트: wulala-wuwu/web
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)
예제 #4
0
 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"
예제 #5
0
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)
예제 #6
0
파일: encrypt.py 프로젝트: Eksmo/calibre
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)
예제 #7
0
    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)
예제 #8
0
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()
예제 #9
0
    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)
예제 #10
0
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()
예제 #11
0
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()
예제 #12
0
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")
예제 #13
0
    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)