1#!/usr/bin/env python2.7
2import popplerqt5
3import PyQt5.QtXml
4import argparse
5import tempfile
6import shutil
7
8def merge(target, src):
9    dom=PyQt5.QtXml.QDomDocument()
10    for pg_index in range(min(target.numPages(),src.numPages())):
11        p_tgt = target.page(pg_index)
12        p_src = src.page(pg_index)
13        for a in p_src.annotations():
14            if not has_annotation(p_tgt,a):
15                a_el = dom.createElement("annotation")
16                popplerqt5.Poppler.AnnotationUtils.storeAnnotation(a,a_el,dom)
17                a_tgt = popplerqt5.Poppler.AnnotationUtils.createAnnotation(a_el)
18                p_tgt.addAnnotation(a_tgt)
19
20def has_annotation(page,a):
21    for pa in page.annotations():
22        if pa.uniqueName() == a.uniqueName():
23            return True
24    return False
25
26def save_pdf(pdf_doc,filename):
27    c = pdf_doc.pdfConverter()
28    c.setOutputFileName(filename)
29    c.setPDFOptions(c.WithChanges)
30    c.convert()
31
32def load_pdf(filename):
33    return popplerqt5.Poppler.Document.load(filename)
34
35
36if __name__ == "__main__":
37    parser = argparse.ArgumentParser(description='A simple utility for merging pdf annotations')
38    parser.add_argument('file', help='the files to merge annotations from', nargs="+")
39    parser.add_argument('--output', help='the file to save annotations to (if not present, will save into the first file)')
40    args = parser.parse_args()
41    tgt = load_pdf(args.file[0])
42    for f in args.file[1:]:
43        src = load_pdf(f)
44        merge(tgt,src)
45    if args.output:
46        save_pdf(tgt,args.output)
47    else:
48        tmp_h,tmp_path = tempfile.mkstemp("pdf")
49        save_pdf(tgt,tmp_path)
50        del tgt
51        shutil.move(tmp_path,args.file[0])
52
53
54
55
56
57
58
59
60
61
62