Skip to content

Commit

Permalink
Merge remote-tracking branch 'origin/74-pypdf-port-encrypt' into 74-p…
Browse files Browse the repository at this point in the history
…ypdf-port-encrypt
  • Loading branch information
sfneal committed Jul 3, 2024
2 parents 392680d + 7c7a601 commit b27af34
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 26 deletions.
26 changes: 15 additions & 11 deletions pdfconduit/conduit/encrypt.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,28 +47,32 @@ def encrypt(self, decrypt=None):
else:
permissions = UserAccessPermissions

with open(self.pdf, 'rb') as pdf_file:
with open(self.pdf, "rb") as pdf_file:
# Read opened PDF file
pdf_reader = pypdf_reader(pdf_file, decrypt)

# Create PDF writer object
pdf_writer = PdfWriter(clone_from=pdf_reader)

# Apply encryption to writer object
pdf_writer.encrypt(user_password=self.user_pw,
owner_password=self.owner_pw,
use_128bit=self.encrypt_128,
permissions_flag=permissions)
pdf_writer.encrypt(
user_password=self.user_pw,
owner_password=self.owner_pw,
use_128bit=self.encrypt_128,
permissions_flag=permissions,
)

# todo: add metadata adding functionality
pdf_writer.add_metadata({
'/Producer': 'pdfconduit',
'/Creator': 'pdfconduit',
'/Author': 'Stephen Neal',
})
pdf_writer.add_metadata(
{
"/Producer": "pdfconduit",
"/Creator": "pdfconduit",
"/Author": "Stephen Neal",
}
)

# Write encrypted PDF to file
with open(self.output, 'wb') as output_pdf:
with open(self.output, "wb") as output_pdf:
pdf_writer.write(output_pdf)
return self.output

Expand Down
16 changes: 8 additions & 8 deletions pdfconduit/utils/_permissions.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,25 @@ def can(self, permission):
return permission in self._permissions and self._permissions[permission]

def can_print(self):
return self.can('print')
return self.can("print")

def can_modify(self):
return self.can('modify')
return self.can("modify")

def can_copy(self):
return self.can('copy')
return self.can("copy")

def can_annotate(self):
return self.can('annotations')
return self.can("annotations")

def can_fill_forms(self):
return self.can('forms')
return self.can("forms")

def can_change_accessability(self):
return self.can('accessability')
return self.can("accessability")

def can_assemble(self):
return self.can('assemble')
return self.can("assemble")

def can_print_high_quality(self):
return self.can('print_high_quality')
return self.can("print_high_quality")
5 changes: 3 additions & 2 deletions pdfconduit/utils/info.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,6 @@ def metadata(self):
return self.pdf.metadata
return self.pdf.getDocumentInfo()


def resources(self):
"""Retrieve contents of each page of PDF"""
return [self.pdf.getPage(i) for i in range(self.pdf.getNumPages())]
Expand All @@ -68,7 +67,9 @@ def resources(self):
def security(self):
"""Print security object information for a pdf document"""
if self.use_pypdf:
return {k: v for i in self.pdf.resolved_objects.items() for k, v in i[1].items()}
return {
k: v for i in self.pdf.resolved_objects.items() for k, v in i[1].items()
}
return {k: v for i in self.pdf.resolvedObjects.items() for k, v in i[1].items()}

@property
Expand Down
21 changes: 16 additions & 5 deletions tests/test_conduit_encrypt.py
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ def test_password_byte_string(self):
# Assert user & owner password byte string is correct
self.assertEqual(
security["/O"],
'ÐHÑRžS]˘—Í8V6{˘KJ’ß\x01æ7ÑnÊ\x06[¯Nd’\x0b',
"ÐHÑRžS]˘—Í8V6{˘KJ’ß\x01æ7ÑnÊ\x06[¯Nd’\x0b",
)

expected_equals_output(function_name_to_file_name(), encrypted.output)
Expand Down Expand Up @@ -287,16 +287,27 @@ def assertSecurityValue(self, security, expected):
self.assertTrue("/P" in security)
self.assertEqual(security["/P"], expected)

def assertPermissions(self, pdf, can_print=False, can_modify=False, can_copy=False, can_annotate=False,
can_fill_forms=False, can_change_accessability=False, can_assemble=False,
can_print_high_quality=False):
def assertPermissions(
self,
pdf,
can_print=False,
can_modify=False,
can_copy=False,
can_annotate=False,
can_fill_forms=False,
can_change_accessability=False,
can_assemble=False,
can_print_high_quality=False,
):
permissions = Info(pdf.output, self.user_pw, use_pypdf=True).permissions
self.assertEqual(permissions.can_print(), can_print)
self.assertEqual(permissions.can_modify(), can_modify)
self.assertEqual(permissions.can_copy(), can_copy)
self.assertEqual(permissions.can_annotate(), can_annotate)
self.assertEqual(permissions.can_fill_forms(), can_fill_forms)
self.assertEqual(permissions.can_change_accessability(), can_change_accessability)
self.assertEqual(
permissions.can_change_accessability(), can_change_accessability
)
self.assertEqual(permissions.can_assemble(), can_assemble)
self.assertEqual(permissions.can_print_high_quality(), can_print_high_quality)

Expand Down

0 comments on commit b27af34

Please sign in to comment.