YUJUUUUUUUUU, al fin lo conseguí! Bueno en realidad lo conseguí ya el lunes, pero entre unas cosas y otras no he tenido tiempo para postearlo antes
Al final tuve que pasar casi completamente de docx y hacerlo con lxml, que por cierto me encantó por lo sencillo y potente que es. Finalmente el código quedo así:
Código Python:
Ver original# -*- coding: utf-8 -*-
from docx import *
def gen_rid():
from random import shuffle
hex = list("0123456789ABCDEF")
shuffle(hex)
return ''.join( hex[0:8] )
def make_link(target, mode = 'External', text = ''):
hyperlink = etree.fromstring(
'''\
<w:p w:rsidR="{rid}" w:rsidRDefault="{rid}" xmlns:w="{url}">
<w:hyperlink>
<w:r w:rsidRPr="{rid}">
<w:rPr>
<w:rStyle w:val="Hipervnculo"/>
</w:rPr>
<w:t>{text}</w:t>
</w:r>
</w:hyperlink>
</w:p>
'''.format(rid = rid, text = text, url = w)
)
links.append({
'hyperlink' : hyperlink[0],
'target' : target,
'mode' : mode,
'text' : text
})
return hyperlink
def new():
d = etree.fromstring( '''<w:document xmlns:w="%s" xmlns:r="%s"></w:document>''' % (w, r) )
dbody = etree.SubElement( d, '{%s}body' % w)
return d, dbody
relationships, rid = relationshiplist(), gen_rid()
links = []
w, r = 'http://schemas.openxmlformats.org/wordprocessingml/2006/main', 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'
d, dbody = new()
dbody.append( make_link('http://www.google.es', 'External', 'http://www.google.es') )
# ...
wordrelationships = wordrelationships(relationships, links)
Y tuve que cambiar el módulo docx:
Código Python:
Ver originaldef wordrelationships(relationshiplist, links = []):
'''Generate a Word relationships file'''
# Default list of relationships
# FIXME: using string hack instead of making element
#relationships = makeelement('Relationships',nsprefix='pr')
relationships = etree.fromstring(
'''<Relationships xmlns="http://schemas.openxmlformats.org/package/2006/relationships"></Relationships>'''
)
count = 1
for relationship in relationshiplist:
# Relationship IDs (rId) start at 1.
relationships.append(
makeelement('Relationship', attributes = {
'Id' : 'rId' + str(count),
'Type' : relationship[0],
'Target' : relationship[1]
}, nsprefix = None)
)
count += 1
# A partir de aquí el código es mío
r = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships' # nsprefix = 'r'
if links: # links != []
for obj in links:
relationships.append(
makeelement('Relationship', attributes = {
'TargetMode' : obj['mode'],
'Id' : 'rId' + str(count),
'Type' : '%s/hyperlink' % r,
'Target' : obj['target']
}, nsprefix = None)
)
hl = obj['hyperlink']
hl.set('{%s}id' % r, 'rId' + str(count))
count += 1
return relationships
para poder darle soporte a los hipervínculos. Lo único que no conseguí es que se vieran como links, de color azul, sino que se siguen viendo como texto plano, pero es lo de menos.
Espero que esto le sirva a alguien algún día
Saludos y gracias por todo :D