issue #2959: fix Python 3.4 not supporting bytes%tuple

This commit is contained in:
Dvořák Václav 2018-01-22 16:39:08 +01:00
parent 6207b44ab1
commit 65112bad7e

View File

@ -10,6 +10,13 @@ except ImportError:
UserDict = collections.UserDict UserDict = collections.UserDict
if sys.version_info.major >= 3:
def make_bytes(s):
return s.encode("us-ascii")
else:
make_bytes = lambda s: s
class PdfFormatError(RuntimeError): class PdfFormatError(RuntimeError):
pass pass
@ -99,10 +106,10 @@ class XrefTable:
else: else:
contiguous_keys = keys contiguous_keys = keys
keys = None keys = None
f.write(b"%d %d\n" % (contiguous_keys[0], len(contiguous_keys))) f.write(make_bytes("%d %d\n" % (contiguous_keys[0], len(contiguous_keys))))
for object_id in contiguous_keys: for object_id in contiguous_keys:
if object_id in self.new_entries: if object_id in self.new_entries:
f.write(b"%010d %05d n \n" % self.new_entries[object_id]) f.write(make_bytes("%010d %05d n \n" % self.new_entries[object_id]))
else: else:
this_deleted_object_id = deleted_keys.pop(0) this_deleted_object_id = deleted_keys.pop(0)
assert object_id == this_deleted_object_id assert object_id == this_deleted_object_id
@ -110,7 +117,7 @@ class XrefTable:
next_in_linked_list = deleted_keys[0] next_in_linked_list = deleted_keys[0]
except IndexError: except IndexError:
next_in_linked_list = 0 next_in_linked_list = 0
f.write(b"%010d %05d f \n" % (next_in_linked_list, self.deleted_entries[object_id])) f.write(make_bytes("%010d %05d f \n" % (next_in_linked_list, self.deleted_entries[object_id])))
return startxref return startxref
@ -135,7 +142,7 @@ class PdfName():
if b in self.allowed_chars: if b in self.allowed_chars:
result.append(b) result.append(b)
else: else:
result.extend(b"#%02X" % b) result.extend(make_bytes("#%02X" % b))
else: else:
result = bytearray(b"/") result = bytearray(b"/")
for b in self.name: for b in self.name:
@ -150,7 +157,7 @@ class PdfName():
class PdfArray(list): class PdfArray(list):
def __bytes__(self): def __bytes__(self):
return b"[ %s ]" % b" ".join(pdf_repr(x) for x in self) return b"[ " + b" ".join(pdf_repr(x) for x in self) + b" ]"
__str__ = __bytes__ __str__ = __bytes__
@ -174,13 +181,19 @@ class PdfDict(UserDict):
# del self.pdf.xref_table[self.orig_ref.object_id] # del self.pdf.xref_table[self.orig_ref.object_id]
# else: # else:
# return bytes(self.orig_ref) # return bytes(self.orig_ref)
out = b"<<" out = bytearray(b"<<")
for key, value in self.items(): for key, value in self.items():
if value is None: if value is None:
continue continue
value = pdf_repr(value) value = pdf_repr(value)
out += b"\n%s %s" % (PdfName(key), value) out.extend(b"\n")
return out + b"\n>>" out.extend(bytes(PdfName(key)))
out.extend(b" ")
out.extend(value)
#out += b"\n%s %s" % (PdfName(key), value)
out.extend(b"\n>>")
return bytes(out)
#return out + b"\n>>"
__str__ = __bytes__ __str__ = __bytes__
@ -196,7 +209,7 @@ class PdfBinary:
if sys.version_info.major >= 3: if sys.version_info.major >= 3:
def __bytes__(self): def __bytes__(self):
return b"<%s>" % b"".join(b"%02X" % b for b in self.data) return make_bytes("<%s>" % "".join("%02X" % b for b in self.data))
def __str__(self): def __str__(self):
return bytes(self).decode("us-ascii") return bytes(self).decode("us-ascii")
@ -224,7 +237,7 @@ def pdf_repr(x):
elif isinstance(x, str) and sys.version_info.major >= 3: elif isinstance(x, str) and sys.version_info.major >= 3:
return pdf_repr(x.encode("utf-8")) return pdf_repr(x.encode("utf-8"))
elif isinstance(x, bytes): elif isinstance(x, bytes):
return b"(%s)" % x.replace(b"\\", b"\\\\").replace(b"(", b"\\(").replace(b")", b"\\)") # XXX escape more chars? handle binary garbage return b"(" + x.replace(b"\\", b"\\\\").replace(b"(", b"\\(").replace(b")", b"\\)") + b")" # XXX escape more chars? handle binary garbage
else: else:
return bytes(x) return bytes(x)
@ -270,7 +283,7 @@ class PdfParser:
if self.info: if self.info:
trailer_dict[b"Info"] = self.info_ref trailer_dict[b"Info"] = self.info_ref
self.last_xref_section_offset = start_xref self.last_xref_section_offset = start_xref
f.write(b"trailer\n%s\nstartxref\n%d\n%%%%EOF" % (PdfDict(trailer_dict), start_xref)) f.write(b"trailer\n" + bytes(PdfDict(trailer_dict)) + make_bytes("\nstartxref\n%d\n%%%%EOF" % start_xref))
def write_obj(self, f, ref, *objs, **dict_obj): def write_obj(self, f, ref, *objs, **dict_obj):
if ref is None: if ref is None: