Ho bisogno di rimuovere intestazioni e piè di pagina in molti file docx. Stavo provando a utilizzare la libreria python-docx, ma al momento non supporta l'intestazione e il piè di pagina nel documento docx (work in progress).Python - Rimuovi intestazione e piè di pagina dal file docx
C'è un modo per ottenerlo in Python?
Come ho capito, docx è un formato basato su xml, ma non so come usarlo.
P.S.I hanno un idea di utilizzare lxml o BeautifulSoup per analizzare xml e sostituire alcune parti, ma sembra sporca
UPD. Grazie a Shawn, per un buon punto di partenza. Mi sono state apportate alcune modifiche alla sceneggiatura. Questa è la mia versione finale (è utile per me, perché ho bisogno di modificare molti file .docx. Sto usando BeautifulSoup, perché il parser xml standard non può ottenere un albero xml valido. Inoltre, i miei documenti docx non hanno intestazione e piè di pagina in XML. Hanno appena collocate immagini della intestazione e piè di in una parte superiore della pagina. Inoltre, per una maggiore velocità è possibile utilizzare lxml al posto di minestra.
import zipfile
import shutil as su
import os
import tempfile
from bs4 import BeautifulSoup
def get_xml_from_docx(docx_filename):
"""
Return content of document.xml file inside docx document
"""
with zipfile.ZipFile(docx_filename) as zf:
xml_info = zf.read('word/document.xml')
return xml_info
def write_and_close_docx(self, edited_xml, output_filename):
""" Create a temp directory, expand the original docx zip.
Write the modified xml to word/document.xml
Zip it up as the new docx
"""
tmp_dir = tempfile.mkdtemp()
with zipfile.ZipFile(self) as zf:
zf.extractall(tmp_dir)
with open(os.path.join(tmp_dir, 'word/document.xml'), 'w') as f:
f.write(str(edited_xml))
# Get a list of all the files in the original docx zipfile
filenames = zf.namelist()
# Now, create the new zip file and add all the filex into the archive
zip_copy_filename = output_filename
docx = zipfile.ZipFile(zip_copy_filename, "w")
for filename in filenames:
docx.write(os.path.join(tmp_dir, filename), filename)
# Clean up the temp dir
su.rmtree(tmp_dir)
if __name__ == '__main__':
directory = 'your_directory/'
files = os.listdir(directory)
for file in files:
if file.endswith('.docx'):
word_doc = directory + file
new_word_doc = 'edited/' + file.rstrip('.docx') + '-edited.docx'
tree = get_xml_from_docx(word_doc)
soup = BeautifulSoup(tree, 'xml')
shapes = soup.find_all('shape')
for shape in shapes:
if 'margin-left:0pt' in shape.get('style'):
shape.parent.decompose()
write_and_close_docx(word_doc, soup, new_word_doc)
Quindi, il gioco è fatto :) lo so, il il codice non è pulito, mi dispiace per quello.
Grazie! Questo codice non ha funzionato, ma dopo alcuni refactoring sono stato fatto! Grazie ancora! – drjackild
@drackild, buono. cosa doveva essere corretto? postalo e condividiamo tutti :) –