mirror of
https://github.com/snapotter-hq/SnapOtter.git
synced 2026-08-03 07:46:42 +02:00
feat(tools): 2.0 phase 5 wave 2 - pdf depth (21 tools) (#220)
This commit is contained in:
@@ -0,0 +1,55 @@
|
||||
"""Read or write PDF document metadata via pikepdf docinfo.
|
||||
Args: {"path": in, "mode": "get"} -> {"metadata": {...}}
|
||||
{"path": in, "out": o, "mode": "set", "metadata": {"Title": "..", ...}} -> {"ok": true}
|
||||
Settable keys: Title, Author, Subject, Keywords, Creator, Producer."""
|
||||
import json
|
||||
import sys
|
||||
|
||||
ALLOWED_KEYS = {"Title", "Author", "Subject", "Keywords", "Creator", "Producer"}
|
||||
|
||||
|
||||
def main():
|
||||
args = json.loads(sys.argv[1]) if len(sys.argv) > 1 else {}
|
||||
path, mode = args.get("path"), args.get("mode", "get")
|
||||
if not path:
|
||||
print(json.dumps({"error": "missing path"}))
|
||||
sys.exit(1)
|
||||
try:
|
||||
import pikepdf
|
||||
except ImportError:
|
||||
print(json.dumps({"error": "pikepdf not installed"}))
|
||||
sys.exit(1)
|
||||
try:
|
||||
if mode == "get":
|
||||
with pikepdf.open(path) as pdf:
|
||||
info = {}
|
||||
if pdf.docinfo is not None:
|
||||
for k, v in pdf.docinfo.items():
|
||||
info[str(k).lstrip("/")] = str(v)
|
||||
print(json.dumps({"metadata": info}))
|
||||
return
|
||||
out = args.get("out")
|
||||
meta = args.get("metadata") or {}
|
||||
if not out or not isinstance(meta, dict):
|
||||
print(json.dumps({"error": "missing out/metadata for set"}))
|
||||
sys.exit(1)
|
||||
with pikepdf.open(path) as pdf:
|
||||
for key, value in meta.items():
|
||||
if key not in ALLOWED_KEYS:
|
||||
continue
|
||||
if value is None or value == "":
|
||||
if f"/{key}" in pdf.docinfo:
|
||||
del pdf.docinfo[f"/{key}"]
|
||||
else:
|
||||
pdf.docinfo[f"/{key}"] = str(value)[:500]
|
||||
pdf.save(out)
|
||||
print(json.dumps({"ok": True}))
|
||||
except SystemExit:
|
||||
raise
|
||||
except Exception as exc: # noqa: BLE001
|
||||
print(json.dumps({"error": str(exc)}))
|
||||
sys.exit(1)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Reference in New Issue
Block a user