Accéder au contenu d'un fichier PDF avec pyPdf
Bonjour,
Je dois faire un programme afin de retirer les images de fichiers pdfs, pour la liseuse électronique de quelqu'un de ma famille.
OS : Xubuntu (mais sera exécuté sous windows)
Pour le moment, j'ai supprimé les ressources "XObjects", qui correspondent aux images, simplement en retirant cette entrée du dictionnaire des ressources.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
|
#!/usr/bin/env python
import copy,sys
import pyPdf
from pyPdf import PdfFileWriter, PdfFileReader
print sys.argv[1]
file_input = PdfFileReader(file(sys.argv[1],'rb'))
file_output = PdfFileWriter()
for i in range(0,file_input.getNumPages()):
p = file_input.getPage(i)
try:
del p['/Resources']['/XObject']
except:
pass
file_output.addPage(p)
file_output.write(file("test.pdf", "wb")) |
En revanche, la ou cela se complique, c'est que j'aimerai aussi retirer les balise de style, les tableaux, et autres objets graphiques, tout en concervant la mise en page.
Pour cela, je dois accéder au contenu...
Du coup j'ai tenté de reproduire la fonction extractText de la bibliothèque, mais je n'y parviens pas car l'importation de la classe ContentStream génère des erreurs..
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
|
def extractText(self):
text = u""
content = self["/Contents"].getObject()
if not isinstance(content, ContentStream):
content = ContentStream(content, self.pdf)
# Note: we check all strings are TextStringObjects. ByteStringObjects
# are strings where the byte->string encoding was unknown, so adding
# them to the text here would be gibberish.
for operands,operator in content.operations:
if operator == "Tj":
_text = operands[0]
if isinstance(_text, TextStringObject):
text += _text
elif operator == "T*":
text += "\n"
elif operator == "'":
text += "\n"
_text = operands[0]
if isinstance(_text, TextStringObject):
text += operands[0]
elif operator == '"':
_text = operands[2]
if isinstance(_text, TextStringObject):
text += "\n"
text += _text
elif operator == "TJ":
for i in operands[0]:
if isinstance(i, TextStringObject):
text += i
return text |
Pour l'instant je passe de la fenêtre droite à la gauche, mais les blocks balises sont concervés.
http://www.zimagez.com/miniature/cap...013-205021.png
Des idées pour résoudre ce problème ?