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.
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.
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"))
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..
Pour l'instant je passe de la fenêtre droite à la gauche, mais les blocks balises sont concervés.
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
Des idées pour résoudre ce problème ?
Partager