HTML. Se preferir uma biblioteca diferente ou usar uma linguagem de programacao diferente de Python, esses exemplos devem ser faceis de adaptar.Chamando o DocBook XSL com lxmlO metodo mais eficiente de chamar XSLT usando lxml e de antemao analisar o XSLT, entao criar um transformador para uso repetitivo. Isso e util, desde que meu script DocBook-para-EPUB aceite varios arquivos DocBook para converter. A Listagem 17 demonstra essa abordagem.import os.pathfrom lxml import etreedef convert_docbook(docbook_file):docbook_xsl = os.path.abspath('docbook-xsl/epub/docbook.xsl')# De ao processador XSLT a capacidade de criar novos diretoriosxslt_ac = etree.XSLTAccessControl(read_file=True,write_file=True,create_dir=True,read_network=True,write_network=False)transform = etree.XSLT(etree.parse(docbook_xsl), access_control=xslt_ac)transform(etree.parse(docbook_file))O modulo EPUB em DocBook XSL cria ele mesmo os arquivos de saida, assim nada e retornado da avaliacao da transformacao aqui. Em vez disso, o DocBook cria duas pastas (META-INF e OEBPS) no diretorio ativo atual para conter os resultados da conversao.Copiando as imagens e outros recursos no archiveO DocBook XSL nao faz nada com as imagens que voce possa fornecer para uso em seu documento; ele apenas cria os arquivos de metadados e o XHTML renderizado. Como a especificacao do EPUB requer que todos os recursos sejam listados no manifesto content.opf, e possivel inspecionar o manifesto para localizar as imagens que foram referidas no arquivo DocBook original. A Listagem 18 mostra essa tecnica, que presume que a variavel path contenha o caminho para seu EPUB em andamento, conforme criado pelo DocBook XSLT.import os.path, shutilfrom lxml import etreedef find_resources(path='/path/to/our/epub/directory'):opf = etree.parse(os.path.join(path, 'OEBPS', 'content.opf'))# Todos os elementos opf:item sao recursos para o item em opf.xpath('//opf:item',namespaces= { 'opf': 'http://www.idpf.org/2007/opf' }):# Se o recurso ainda nao tiver sido criado pelo proprio DocBook XSL,# copie-o na pasta do OEBPShref = item.attrib['href']referenced_file = os.path.join(path, 'OEBPS', href):if not os.path.exists(referenced_file):shutil.copy(href, os.path.join(path, 'OEBPS'))Criando o arquivo tipo MIME automaticamenteO DocBook XSL nao criara seu arquivo tipo MIME, tambem, mas uma rapida consulta no codigo da Listagem 19 pode resolver isso.def create_mimetype(path='/path/to/our/epub/directory'):f = '%s/%s' % (path, 'mimetype')f = open(f, 'w')# Cuidado para nao incluir uma nova linha aquif.write('application/epub+zip')f.close()Criando o pacote configuravel do EPUB com PythonTudo o que resta agora e empacotar os arquivos em um arquivo EPUB ZIP valido. Isso exige duas etapas: incluir o arquivo tipo MIME como o primeiro no archive sem nenhuma compactacao e, em seguida, incluir os diretorios restantes. A Listagem 20 mostra o codigo para esse processo.import zipfile, osdef create_archive(path='/path/to/our/epub/directory'):'''Create the ZIP archive. The mimetype must be the first file in the archiveand it must not be compressed.'''epub_name = '%s.epub' % os.path.basename(path)# The EPUB must contain the META-INF and mimetype files at the root, so# we'll create the archive in the working directory first and move it lateros.chdir(path)# Open a new zipfile for writingepub = zipfile.ZipFile(epub_name, 'w')# Add the mimetype file first and set it to be uncompressedepub.write(MIMETYPE, compress_type=zipfile.ZIP_STORED)# For the remaining paths in the EPUB, add all of their files# using normal ZIP compressionfor p in os.listdir('.'):for f in os.listdir(p):epub.write(os.path.join(p, f)), compress_type=zipfile.ZIP_DEFLATED)epub.close()So isso! Lembre-se de validar. ResumoO script Python na secao anterior e somente uma primeira etapa ao automatizar integralmente qualquer tipo de conversao do EPUB. Para ser breve, essa etapa nao lida com muitos casos comuns, como caminhos aninhados arbitrariamente, folhas de estilos ou fontes