Extraer texto de anotaciones resaltadas en un archivo PDF

Desde ayer estoy tratando de extraer el texto de algunas anotaciones resaltadas en un pdf, usando python-popplerqt4.

Según esta documentación , parece que tengo que obtener el texto usando el método Page.text (), pasando un argumento Rectangle de la anotación resaltada, que obtengo usando Annotation.boundary (). Pero solo obtengo texto en blanco. ¿Alguien me puede ayudar? Copié mi código a continuación y agregué un enlace para el PDF que estoy usando. ¡Gracias por cualquier ayuda!

import popplerqt4 import sys import PyQt4 def main(): doc = popplerqt4.Poppler.Document.load(sys.argv[1]) total_annotations = 0 for i in range(doc.numPages()): page = doc.page(i) annotations = page.annotations() if len(annotations) > 0: for annotation in annotations: if isinstance(annotation, popplerqt4.Poppler.Annotation): total_annotations += 1 if(isinstance(annotation, popplerqt4.Poppler.HighlightAnnotation)): print str(page.text(annotation.boundary())) if total_annotations > 0: print str(total_annotations) + " annotation(s) found" else: print "no annotations found" if __name__ == "__main__": main() 

Prueba de pdf: https://www.dropbox.com/s/10plnj67k9xd1ot/test.pdf

En cuanto a la documentación de Anotaciones , parece que la propiedad de límite Devuelve el rectángulo de límite de esta anotación en coordenadas normalizadas. Aunque parece una decisión extraña, simplemente podemos escalar las coordenadas por los page.pageSize().width() y .height() .

 import popplerqt4 import sys import PyQt4 def main(): doc = popplerqt4.Poppler.Document.load(sys.argv[1]) total_annotations = 0 for i in range(doc.numPages()): #print("========= PAGE {} =========".format(i+1)) page = doc.page(i) annotations = page.annotations() (pwidth, pheight) = (page.pageSize().width(), page.pageSize().height()) if len(annotations) > 0: for annotation in annotations: if isinstance(annotation, popplerqt4.Poppler.Annotation): total_annotations += 1 if(isinstance(annotation, popplerqt4.Poppler.HighlightAnnotation)): quads = annotation.highlightQuads() txt = "" for quad in quads: rect = (quad.points[0].x() * pwidth, quad.points[0].y() * pheight, quad.points[2].x() * pwidth, quad.points[2].y() * pheight) bdy = PyQt4.QtCore.QRectF() bdy.setCoords(*rect) txt = txt + unicode(page.text(bdy)) + ' ' #print("========= ANNOTATION =========") print(unicode(txt)) if total_annotations > 0: print str(total_annotations) + " annotation(s) found" else: print "no annotations found" if __name__ == "__main__": main() 

Además, decidí concatenar los .highlightQuads() para obtener una mejor representación de lo que realmente se destacó.

Tenga en cuenta el explícito que he adjuntado a cada región de texto cuádruple.

En el documento de ejemplo, la QString devuelta no se pudo pasar directamente a print() o str() , la solución a esto fue utilizar unicode() lugar.

Espero que esto ayude a alguien como me ayudó.

Nota: la rotación de la página puede afectar los valores de escala, no he podido probar esto.