Ich muss Kopf- und Fußzeilen in vielen docx-Dateien entfernen. Ich habe gerade versucht, Python-DOCX-Bibliothek zu verwenden, aber es unterstützt keine Kopf- und Fußzeile in DOCX-Dokument zu diesem Zeitpunkt (in Arbeit).Python - Entfernen Sie Kopf- und Fußzeile aus docx-Datei
Gibt es eine Möglichkeit, das in Python zu erreichen?
Wie ich verstehe, ist docx ein XML-basiertes Format, aber ich weiß nicht, wie man es benutzt.
p.s.i. haben eine Idee lxml oder BeautifulSoup verwenden xml zu analysieren und einige Teile zu ersetzen, aber es sieht schmutzig
UPD. Danke an Shawn, für einen guten Startpunkt. Ich habe einige Änderungen am Skript vorgenommen. Dies ist meine finale Version (sie ist nützlich für mich, da ich viele .docx Dateien bearbeiten muss. Ich benutze BeautifulSoup, weil Standart XML Parser keinen gültigen XML-Baum bekommen kann. Auch meine docx Dokumente haben keine Kopf- und Fußzeilen in xml. Sie stellten nur die Bilder der und Fußzeile Kopfzeile in einem oben auf der Seite. auch Sie für mehr Geschwindigkeit lxml statt Suppe.
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)
So verwenden können, das ist es :) ich weiß, das Code ist nicht sauber, sorry dafür.
Vielen Dank! Dieser Code hat nicht funktioniert, aber nach einigen Refactoring wurde ich es gemacht! Danke noch einmal! – drjackild
@drackild, gut. Was musste korrigiert werden? poste es und lass uns alle teilen :) –