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