| @@ -1,17 +1,18 @@ | | | @@ -1,17 +1,18 @@ |
1 | $NetBSD: patch-pyPdf_pdf.py,v 1.2 2017/01/09 12:02:23 joerg Exp $ | | 1 | $NetBSD: patch-pyPdf_pdf.py,v 1.3 2019/07/29 20:39:39 joerg Exp $ |
2 | | | 2 | |
3 | python-3.x compatibility. | | 3 | python-3.x compatibility. |
4 | When renaming resources, make sure that the new name is actually new. | | 4 | When renaming resources, make sure that the new name is actually new. |
| | | 5 | Preserve annotations on page merge. |
5 | | | 6 | |
6 | --- pyPdf/pdf.py.orig 2010-12-04 22:49:56.000000000 +0000 | | 7 | --- pyPdf/pdf.py.orig 2010-12-04 22:49:56.000000000 +0000 |
7 | +++ pyPdf/pdf.py | | 8 | +++ pyPdf/pdf.py |
8 | @@ -652,7 +652,7 @@ class PdfFileReader(object): | | 9 | @@ -652,7 +652,7 @@ class PdfFileReader(object): |
9 | if not self._override_encryption and self.isEncrypted: | | 10 | if not self._override_encryption and self.isEncrypted: |
10 | # if we don't have the encryption key: | | 11 | # if we don't have the encryption key: |
11 | if not hasattr(self, '_decryption_key'): | | 12 | if not hasattr(self, '_decryption_key'): |
12 | - raise Exception, "file has not been decrypted" | | 13 | - raise Exception, "file has not been decrypted" |
13 | + raise Exception("file has not been decrypted") | | 14 | + raise Exception("file has not been decrypted") |
14 | # otherwise, decrypt here... | | 15 | # otherwise, decrypt here... |
15 | import struct | | 16 | import struct |
16 | pack1 = struct.pack("<i", indirectReference.idnum)[:3] | | 17 | pack1 = struct.pack("<i", indirectReference.idnum)[:3] |
17 | @@ -704,14 +704,14 @@ class PdfFileReader(object): | | 18 | @@ -704,14 +704,14 @@ class PdfFileReader(object): |
| @@ -57,13 +58,22 @@ When renaming resources, make sure that | | | @@ -57,13 +58,22 @@ When renaming resources, make sure that |
57 | for key in page2Res.keys(): | | 58 | for key in page2Res.keys(): |
58 | if newRes.has_key(key) and newRes[key] != page2Res[key]: | | 59 | if newRes.has_key(key) and newRes[key] != page2Res[key]: |
59 | - newname = NameObject(key + "renamed") | | 60 | - newname = NameObject(key + "renamed") |
60 | + base_newkey = key + "renamed" | | 61 | + base_newkey = key + "renamed" |
61 | + newkey = base_newkey | | 62 | + newkey = base_newkey |
62 | + counter = 0 | | 63 | + counter = 0 |
63 | + while newRes.has_key(newkey) or page2Res.has_key(newkey): | | 64 | + while newRes.has_key(newkey) or page2Res.has_key(newkey): |
64 | + newkey = "%s%d" % (base_newkey, counter) | | 65 | + newkey = "%s%d" % (base_newkey, counter) |
65 | + counter = counter + 1 | | 66 | + counter = counter + 1 |
66 | + newname = NameObject(newkey) | | 67 | + newname = NameObject(newkey) |
67 | renameRes[key] = newname | | 68 | renameRes[key] = newname |
68 | newRes[newname] = page2Res[key] | | 69 | newRes[newname] = page2Res[key] |
69 | elif not newRes.has_key(key): | | 70 | elif not newRes.has_key(key): |
| | | 71 | @@ -1149,7 +1155,7 @@ class PageObject(DictionaryObject): |
| | | 72 | originalResources = self["/Resources"].getObject() |
| | | 73 | page2Resources = page2["/Resources"].getObject() |
| | | 74 | |
| | | 75 | - for res in "/ExtGState", "/Font", "/XObject", "/ColorSpace", "/Pattern", "/Shading", "/Properties": |
| | | 76 | + for res in "/ExtGState", "/Font", "/XObject", "/ColorSpace", "/Pattern", "/Shading", "/Properties", "/Annots": |
| | | 77 | new, newrename = PageObject._mergeResources(originalResources, page2Resources, res) |
| | | 78 | if new: |
| | | 79 | newResources[NameObject(res)] = new |