Skip to content

Commit 3a745af

Browse files
authored
BUG: Ensure add_metadata can deal with _info = None (#3040)
The `assert isinstance` hid the information that `_info` is `Optional`, in which case `add_metadata` would raise an assertion error. Properly initialize `_info` if it's not set. Fixes #3036.
1 parent afb86b9 commit 3a745af

File tree

2 files changed

+31
-3
lines changed

2 files changed

+31
-3
lines changed

pypdf/_writer.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -1587,8 +1587,7 @@ def metadata(
15871587
else:
15881588
if self._info is not None:
15891589
self._info.clear()
1590-
else:
1591-
self._info = DictionaryObject()
1590+
15921591
self.add_metadata(value)
15931592

15941593
def add_metadata(self, infos: Dict[str, Any]) -> None:
@@ -1607,7 +1606,8 @@ def add_metadata(self, infos: Dict[str, Any]) -> None:
16071606
if isinstance(value, PdfObject):
16081607
value = value.get_object()
16091608
args[NameObject(key)] = create_string_object(str(value))
1610-
assert isinstance(self._info, DictionaryObject)
1609+
if self._info is None:
1610+
self._info = DictionaryObject()
16111611
self._info.update(args)
16121612

16131613
def compress_identical_objects(

tests/test_writer.py

+28
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,34 @@ def test_writer_clone():
7878
assert "PageObject" in str(type(writer.pages[0]))
7979

8080

81+
def test_clone_metadata():
82+
src = RESOURCE_ROOT / "pdflatex-outline.pdf"
83+
reader = PdfReader(src)
84+
85+
writer = PdfWriter(clone_from=reader)
86+
writer.add_metadata({"/foo": "bar"})
87+
assert writer.metadata == {
88+
**reader.metadata,
89+
"/foo": "bar",
90+
}
91+
92+
writer = PdfWriter()
93+
writer.clone_document_from_reader(reader)
94+
writer.add_metadata({"/foo": "bar"})
95+
assert writer.metadata == {
96+
**reader.metadata,
97+
"/foo": "bar",
98+
}
99+
writer.metadata = None
100+
writer.add_metadata({"/foo": "bar"})
101+
assert writer.metadata == {"/foo": "bar"}
102+
103+
writer = PdfWriter()
104+
writer.clone_reader_document_root(reader)
105+
writer.add_metadata({"/foo": "bar"})
106+
assert writer.metadata == {"/foo": "bar"}
107+
108+
81109
def test_writer_clone_bookmarks():
82110
# Arrange
83111
src = RESOURCE_ROOT / "Seige_of_Vicksburg_Sample_OCR-crazyones-merged.pdf"

0 commit comments

Comments
 (0)