Screenshots de ressources numériques
Par Vincent Bonamy le samedi 22 décembre 2007, 10:57 - Lien permanent
Ceci est un blog professionnel. Les objectifs de ce blog sont multiples. Principalement, le but est de partager/mutualiser un certain nombre de choses, d'idées, de pratiques autour des sujets que je peux traiter durant mon travail au Centre de Ressources Informatique de Rennes1. Je travaille autour de ORI-OAI, J2EE, Spring, JSF, Hibernate, Acegi, XML, LOM, OAI-PMH, Python, Zope, Plone (parfois du Ruby), XForms, etc. Je suis ammené sur mon poste de travail Debian ou sur serveurs, à faire * du développement "propre" (repository subversion, documentation docbook mis à jour en fonction, etc.) * du "bricolage" (scripts en tout genre, conversions de données, installation et utilisation de packages, etc.) * de l'exploitation en tout genre (ldap, apache, tomcat, sauvegardesz de bds, etc). Dans ce blog vous trouverez +/- en vrac des choses autour de cela simplement. En tout cas, bonne lecture !
Par Vincent Bonamy le samedi 22 décembre 2007, 10:57 - Lien permanent
Ce billet présente une solution légère de captures d’écran de ressources numériques.
Dans cette solution, on interroge par python le module ori-oai-indexing pour extraire les urls et identifiants des ressources indexées.
Par le biais d’un serveur X virtuel (Xvfb) on utilise ensuite sur un serveur (sans interface graphique) un certain nombre d’outils permettant de réaliser des "captures d’écran" des ressources identifiées par les urls.
Ce billet aborde en fait plusieurs points qui peuvent être repris de manière indépendante : dans un contexte hors ORI-OAI notamment.
Face à des solutions comme browsershots la solution est ici légère et simple mais elle reste dans le domaine du "bricolage" (qui marche cependant ! :-) ).
apt-get install python-libxml2def getUrlsIdsFromOriIndexing():
urls_ids = []
WSDLFILE = ’http://ori-oai-indexing.univ-rennes1.fr/indexing/xfire/IndexingService?WSDL’
oriindexing = WSDL.Proxy(WSDLFILE)
request = ’md-ori-oai-namespace:("http://ltsc.ieee.org/xsd/LOM")’
results = oriindexing.searchXMLDocs(request, 1, 5)[’results’][’SearchResult’]
for result in results:
if result[’id’] != None and result[’noticeContent’]!= None:
ide = result[’id’]
url = getUrl(result[’noticeContent’].encode(’utf-8’))
urls_ids.append((ide, url))
return urls_ids
def getUrl(lomXml):
doc = libxml2.parseDoc(lomXml)
ctxt = doc.xpathNewContext()
ctxt.xpathRegisterNs(’lom’, ’http://ltsc.ieee.org/xsd/LOM’)
res = ctxt.xpathEval("//lom:technical/lom:location")
return res[0].get_content()
searchXMLDocs à 5 pour tester plus facilement.ctxt.xpathRegisterNs('lom', 'http://ltsc.ieee.org/xsd/LOM')ctxt.xpathEval("//lom:technical/lom:location")getUrlsIdsFromOriIndexing() dans une console python (le fichier python étant shot.py):>>> import shot
>>> shot.getUrlsIdsFromOriIndexing()
[(’rennes1-ori-wf-1-295’, ’http://www.med.univ-rennes1.fr/wkf/stock/RENNES20071019121406burgunsondages08.pdf’), (’rennes1-ori-wf-1-289’, ’http://www.med.univ-rennes1.fr/wkf/stock/RENNES20061221025012lepogampLA_FONCTION_RENALE.doc’), (’rennes1-ori-wf-1-285’, ’http://www.med.univ-rennes1.fr/wkf/stock/RENNES20060915113249tbuiPoly_SEmio_2006.pdf’), (’rennes1-ori-wf-1-283’, ’http://www.med.univ-rennes1.fr/wkf/stock/RENNES20060613052202duvauferBases_en_radioanatomie_1.ppt’), (’rennes1-ori-wf-1-287’, ’http://www.med.univ-rennes1.fr/wkf/stock/RENNES20061213113922deugnierAnatomoPhysioFoie.doc’)]
>>>
Il faut installer Firefox sur le serveur, mais pour qu’il puisse tourner, il faut aussi installer un serveur X virtuel que l’on démarrera lorsqu’on aura besoin de Firefox simplement : Xvfb par exemple.
On démarrera Firefox comme cela :
Pour la capture on peut utiliser import par exemple fourni avec imagemagick, d’autant qu’une fois la capture faite, imagemagick pourra nous servir également pour retravailler nos images à souhait : en faire des vignettes (thumbnail), y mettre un effet shadow (ombre), etc.Xvfb :1 -screen 0 1280x960x24&
firefox --display=:1 http://www.univ-rennes1.fr
Un des soucis que l’on peut rencontrer avec Firefox cependant est que la taille de la fenêtre de firefox ne s’ouvrira pas forcément en grand ... dans certaines versions on a l’option -fullscreen de disponible mais pas dans toutes.
Un certain nombre d’extensions firefox peuvent résoudre habilement ce problème, on peut utiliser :
conjointement.gs -dNOPAUSE -sDEVICE=png256 -q -dBATCH -sOutputFile=test.png test.pdf
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os
import time
from SOAPpy import WSDL
import libxml2
import urllib
def closeFirefox():
os.system('killall -3 firefox')
os.system('killall -9 firefox-bin')
def closeXvfb():
os.system('killall -9 Xvfb')
def initXvfb():
psXvfb = os.popen('ps -edf | grep Xvfb').readlines()
if len(psXvfb) < 3:
os.system('Xvfb :1 -screen 0 1280x960x24&')
#os.system('Xvfb :1 -screen 0 1024x768x24&')
time.sleep(3)
def launchFirefox(url):
psFirefox = os.popen('ps -edf | grep firefox').readlines()
if len(psFirefox) < 3:
print '##### open url ... :' + url
os.system('firefox --display=:1 ' + url + ' &')
#wid = os.popen('DISPLAY=:1 wmctrl -lp | grep firefox | cut -f1 -d\ ').readlines[0]
#print wid
#os.popen('DISPLAY=:1 wmctrl -i -r ' + wid + ' -b toggle,fullscreen,above')
time.sleep(3)
def shot(name, url):
try:
url_open = urllib.urlopen(url)
infos = url_open.info()
typ = infos.gettype()
if url_open.geturl()[:5] != 'https':
typ = typ
if typ == 'text/html':
# os.system('DISPLAY=:1 firefox -remote "openurl(' + url + ')"')
launchFirefox(url)
time.sleep(10)
os.system('DISPLAY=:1 import -window root ' + name + '.png')
closeFirefox()
if typ == 'application/pdf':
urllib.urlretrieve(url,name)
os.system('gs -dNOPAUSE -sDEVICE=png256 -q -dBATCH -sOutputFile=' + name +'.png ' + name)
time.sleep(1)
except:
print 'error ...'
def thumb(img):
os.system('cp ' + img +'.png ' + 'thumb-' + img +'.png ')
os.system('mogrify -thumbnail 100 thumb-' + img +'.png')
def thumb300(img):
os.system('cp ' + img +'.png ' + 'thumb300-' + img +'.png ')
os.system('mogrify -thumbnail 300 thumb300-' + img +'.png')
def vignette(img):
os.system('convert ' + 'thumb-' + img + '.png -bordercolor grey60 -border 1 -background black \( +clone -shadow 60x4+4+4 \) +swap -background none -flatten -depth 8 ' + 'vign-thumb-' + img + '.png')
def getUrlsIdsFromOriIndexing():
urls_ids = []
WSDLFILE = 'http://localhost:6380/ori-oai-indexing/xfire/IndexingService?wsdl'
oriindexing = WSDL.Proxy(WSDLFILE)
request = 'md-ori-oai-namespace:("http://ltsc.ieee.org/xsd/LOM")'
results = oriindexing.searchXMLDocs(request, 1, 5)['results']['SearchResult']
for result in results:
if result['id'] != None and result['noticeContent']!= None:
ide = result['id']
url = getUrl(result['noticeContent'].encode('utf-8'))
urls_ids.append((ide, url))
return urls_ids
def getUrl(lomXml):
doc = libxml2.parseDoc(lomXml)
ctxt = doc.xpathNewContext()
ctxt.xpathRegisterNs('lom', 'http://ltsc.ieee.org/xsd/LOM')
res = ctxt.xpathEval("//lom:technical/lom:location")
return res[0].get_content()
closeXvfb()
closeFirefox()
initXvfb()
print 'init Xvfb ok ...'
for (id, url) in getUrlsIdsFromOriIndexing():
url = url.replace('https','http')
print url + " ... : " + id
shot(id, url)
thumb300(id)
thumb(id)
vignette(id)
closeXvfb()
print 'close Xvfb ok ...'

Commentaires