# `update_info` Update PDF metadata from `dump_data` instructions ## Usage > pdftl `` `update_info` `` `output` `` ## Details Updates the document-level metadata and structural information of the input PDF by reading from a specified `` file (or stdin, if `` is '-'). Alternatively, instructions can be specified in a structured JSON file, loaded by setting `` to `@instructions.json`. This operation consumes the plain-text format generated by the `dump_data` command. It correctly parses the XML-escaped strings created by that command. This operation can read a full `dump_data` file in pdftk 'stanza' format, and will apply the following sections to the output PDF: * **Info:** Updates the Document Info dictionary (Title, Author, Subject, Keywords, CreationDate, ModDate, and custom keys). * **Bookmarks:** Deletes all existing bookmarks and replaces them with the `Bookmark` stanzas from the input file. Target page numbers are 1-indexed. * **PageMedia:** Applies page-level settings (Rotation, CropBox, TrimBox) as defined in `PageMedia` stanzas. Page numbers are 1-indexed. * **PageLabels:** Replaces the document's page labelling scheme (e.g., "i, ii, iii") using the `PageLabel` stanzas from the input file. Indices are 1-indexed. * **PdfID:** Updates the `PdfID0` top-level field (the creation ID). * You may provide a 32-character hex string to set a PdfID0. For example, `PdfID0: 1234abcd1234abcd1234abcd1234abcd` * **Fresh Bake:** If you set `PdfID0` to the string `RESET` (case-insensitive), the tool will remove the existing ID array. The underlying library will generate a brand new, matching ID pair (ID0=ID1) when saving. * `PdfID1` (the modification ID) is **not** updatable; it is automatically managed by the underlying PDF library to ensure specification compliance. Providing a `PdfID1` value in the input will result in a warning. It will otherwise be ignored. For a complete description of the stanza-based input format this command expects, see the help for `dump_data`. The format of the JSON for `@instructions.json` is hopefully intuitive. Key values for `update_info` should be xml-escaped. (For `update_info_utf8` they should not be.) Here is an example for `update_info`: ``` { "Info": { "Title": "Annual Financial Report & Accounts 2025", "Author": "Acme Corp", "Subject": "Financial Data", "Keywords": "finance, report, 2025", "CustomKey": "Internal-ID-99" }, "PdfID0": "38a4d9afd883e2750c63c2473ffd21e1", "BookmarkList": [ { "Title": "Executive Summary", "Level": 1, "PageNumber": 1 }, { "Title": "Financial Statements", "Level": 1, "PageNumber": 5, "Children": [ { "Title": "Income Statement", "Level": 2, "PageNumber": 6 }, { "Title": "Balance Sheet", "Level": 2, "PageNumber": 8 } ] } ], "PageMediaList": [ { "PageNumber": 1, "Rotation": 90 } ], "PageLabelList": [ { "Index": 1, "Style": "LowercaseRoman", "Start": 1 }, { "Index": 5, "Style": "DecimalArabic", "Start": 1 } ] } ``` Where it makes sense, you can omit keys in order to perform a partial update. ## Examples > Update metadata according to meta.txt ``` pdftl in.pdf update_info meta.txt output out.pdf ``` **Tags**: info, metadata *Source: pdftl.operations.update_info* *Read online: [https://pdftl.readthedocs.io/en/stable/operations/update_info.html](https://pdftl.readthedocs.io/en/stable/operations/update_info.html)* *Type: Operation*