J'aimerais écrire un petit script (qui sera exécuté sur un serveur Linux sans tête) qui lit un fichier PDF, met en évidence le texte qui correspond à quelque chose dans une gamme de chaînes que je passe, puis enregistre le PDF modifié. J'imagine que je vais finir par utiliser quelque chose comme le reliures Python au pogleur mais malheureusement, il y a à côté de zéro documentation et J'ai à côté de zéro expérience dans Python. p>
Si quelqu'un pouvait me diriger vers un tutoriel, un exemple ou une documentation utile pour me faire commencer, il serait grandement apprécié! P>
3 Réponses :
Avez-vous essayé de regarder pdfminer ? On dirait que ça fait ce que tu veux. P>
D'après ce que je rassemble, PDFminer vise à la fin de l'extraction de texte PDF-> Il ne semble pas que cela puisse mettre en évidence et rendre le PDF modifié dans un fichier.
PDFLIB a des fixations Python et prend en charge ces opérations. Vous voulez avec PDI si vous voulez ouvrir un PDF. http://www.pdflib.com/products/pdffib-family/pdffib- PDI / et TET. P>
Malheureusement, c'est un produit commercial. J'ai utilisé cette bibliothèque dans la production dans le passé et cela fonctionne bien. Les reliures sont très fonctionnelles et pas si python. J'ai vu des tentatives pour les rendre plus pythoniques: https://github.com/alexhayes/pythonic-pdffibfib < / a> Vous voudrez utiliser: open_pdi_document (). p>
On dirait que vous voudrez faire la recherche de la sélection de quelque sorte: p>
http://www.pdflib.com / TET-Cookbook / Tet-and-PDffib / Might-Search-termes / P>
Oui, il est possible avec une combinaison de pdfminer ( Tout d'abord, trouvez les coordonnées (par exemple comme Ce ). Ensuite, mettez-la en surbrillance: P> pdfmininer.six code>) et
pydf2 code>.
#!/usr/bin/env python
"""Create sample highlight in a PDF file."""
from PyPDF2 import PdfFileWriter, PdfFileReader
from PyPDF2.generic import (
DictionaryObject,
NumberObject,
FloatObject,
NameObject,
TextStringObject,
ArrayObject
)
def create_highlight(x1, y1, x2, y2, meta, color=[0, 1, 0]):
"""
Create a highlight for a PDF.
Parameters
----------
x1, y1 : float
bottom left corner
x2, y2 : float
top right corner
meta : dict
keys are "author" and "contents"
color : iterable
Three elements, (r,g,b)
"""
new_highlight = DictionaryObject()
new_highlight.update({
NameObject("/F"): NumberObject(4),
NameObject("/Type"): NameObject("/Annot"),
NameObject("/Subtype"): NameObject("/Highlight"),
NameObject("/T"): TextStringObject(meta["author"]),
NameObject("/Contents"): TextStringObject(meta["contents"]),
NameObject("/C"): ArrayObject([FloatObject(c) for c in color]),
NameObject("/Rect"): ArrayObject([
FloatObject(x1),
FloatObject(y1),
FloatObject(x2),
FloatObject(y2)
]),
NameObject("/QuadPoints"): ArrayObject([
FloatObject(x1),
FloatObject(y2),
FloatObject(x2),
FloatObject(y2),
FloatObject(x1),
FloatObject(y1),
FloatObject(x2),
FloatObject(y1)
]),
})
return new_highlight
def add_highlight_to_page(highlight, page, output):
"""
Add a highlight to a PDF page.
Parameters
----------
highlight : Highlight object
page : PDF page object
output : PdfFileWriter object
"""
highlight_ref = output._addObject(highlight)
if "/Annots" in page:
page[NameObject("/Annots")].append(highlight_ref)
else:
page[NameObject("/Annots")] = ArrayObject([highlight_ref])
def main():
pdf_input = PdfFileReader(open("samples/test3.pdf", "rb"))
pdf_output = PdfFileWriter()
page1 = pdf_input.getPage(0)
highlight = create_highlight(89.9206, 573.1283, 376.849, 591.3563, {
"author": "John Doe",
"contents": "Lorem ipsum"
})
add_highlight_to_page(highlight, page1, pdf_output)
pdf_output.addPage(page1)
output_stream = open("output.pdf", "wb")
pdf_output.write(output_stream)
if __name__ == '__main__':
main()
Bonjour, sommes-nous capables de mettre en évidence toutes les lignes à l'aide d'une seule coordonnée Y? Par exemple, seulement Y1 et tout marquer de gauche à droite? Merci!
Je ne sais pas pourquoi cette réponse n'est pas suscitée plus :) ..life sauvegarde des choses ..big merci à l'auteur
Ce n'est généralement pas 100% imbécile, comme tout compilateur PDF - même une ancienne et fiable comme PDFTEX pourrait dessiner des alignements PDF tous les places ... Êtes-vous sûr que vos PDF peuvent être lus de telle manière?
La façon dont je le vois, la fonction "Trouver" dans Evince (ou la plupart des autres lecteurs PDF, pour cette affaire) fait fondamentalement ce que je veux - il met en évidence le texte correspondant, en gros, tout PDF. Si cela peut rendre une telle mise en surbrillance à l'écran, pourquoi ne pas le rendre dans un fichier?
C'est juste un peu délicat, car le PDF ne fournit généralement pas de flux de texte. C'est plus comme une image - le texte peut apparaître n'importe où. Souvent, il a l'air bien pour le lecteur, mais est en interne un gâchis. À l'esprit - Souvent, la justification du texte est obtenue en brisant du texte et en plaçant simplement des inlines afin qu'elle semble justifiée. Quoi qu'il en soit, quand Evince met en évidence quelque chose, il est soit intelligent, votre PDF se comporte bien ou vous obtenez simplement de la chance car cette chaîne particulière réside comme une entité continue dans le PDF. Quoi qu'il en soit, jetez un coup d'œil à itextpdf.com C'est la meilleure bibliothèque libre.
Avez-vous déjà trouvé une réponse à cette question? Si oui, j'aimerais l'entendre :)
Pour les personnes qui arrivent ici via Google: Comment extraire des pièces en surbrillance des fichiers PDF