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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.




Des idées pour résoudre ce problème ?