У меня есть сценарий использования, который использует элемент <w:altChunk/>
в документе Word путем внедрения (фрагмента) HTML-файла в качестве альтернативных фрагментов и позволяет Word сделать это, когда файл открывается. Текущая реализация использовала XML / XSL для составления WordML XML, изменения отношений и выполнения всех операций по упаковке вручную, что является настоящей болью.
Я хотел перейти на python-docx, но API не поддерживает это напрямую. В настоящее время я нашел способ добавить <w:altChunk/>
в документ XML. Но все еще трудно найти способ добавить отношения и связанный файл в пакет.
Я думаю, что должен создать совместимую деталь и передать ее функции document.part.relate_to
для выполнения своей работы. Но все еще не могу понять, как:
from docx import Document
from docx.oxml import OxmlElement, qn
from docx.opc.constants import RELATIONSHIP_TYPE as RT
def add_alt_chunk(doc: Document, chunk_part):
''' TODO: figuring how to add files and relationships'''
r_id = doc.part.relate_to(chunk_part, RT.A_F_CHUNK)
alt = OxmlElement('w:altChunk')
alt.set(qn('r:id'), r_id)
doc.element.body.sectPr.addprevious(alt)
Обновление:
Согласно совету Скани, ниже приведен мой рабочий код. Большое спасибо, Стив!
from docx import Document
from docx.oxml import OxmlElement
from docx.oxml.ns import qn
from docx.opc.part import Part
from docx.opc.constants import RELATIONSHIP_TYPE as RT
def add_alt_chunk(doc: Document, html: str):
package = doc.part.package
partname = package.next_partname('/word/altChunk%d.html')
alt_part = Part(partname, 'text/html', html.encode(), package)
r_id = doc.part.relate_to(alt_part, RT.A_F_CHUNK)
alt_chunk = OxmlElement('w:altChunk')
alt_chunk.set(qn('r:id'), r_id)
doc.element.body.sectPr.addprevious(alt_chunk)
doc = Document()
doc.add_paragraph('Hello')
add_alt_chunk(doc, "<body><strong>I'm an altChunk</strong></body>")
doc.add_paragraph('Have a nice day!')
doc.save('test.docx')
Примечание : части altChunk работают / появляются только когда документ открыт с использованием MS Word