2017-11-27 1 views
0

Ich plane, die bestimmte Überschrift in dem Dokument zu suchen, und dann muss ich den gesamten Inhalt in dieser Überschrift streichen. Das Dokument hat viele Überschriften, jede Überschrift kann Absätze, Tabellen, Bilder insgesamt oder in beliebigen Kombinationen enthalten.Zugriff auf XML-Inhalt <a14: sharpenSoften> für Bild Verwischen mit Python Docx

Ich habe docx installiert, ich war in der Lage, die bestimmte Überschrift zu suchen, streichen Absatz, Tabellen.

Jetzt nächste Aufgabe auf den Zugriff auf die Bilder unter dieser Überschrift und diese Bilder verschwimmen (statt Ausstreichen, planen wir, um das Bild zu verwischen)

Ich bin in der Lage zu bekommen, die Ressource-ID für die Bilder, die unter sind spezifische Heading indem Sie den Code in dem Link mit Bluring the Image which is under specific Heading using Python docx

da es keine direkten API diese Funktionen unterstützt, ich versuche, den XML-Code zu verwenden, wie in https://github.com/python-openxml/python-docx/issues/55#issuecomment-43914055 verwiesen ..

ich habe den XML-Code ohne Unschärfe und mit Unschärfe (durch manuelle Einstellung des Künstlerischen Effekts (fo r Blur) von Image)

XML-Code für das Bild ohne Unschärfen:

<pic:blipFill> 
    <a:blip r:embed="rId11"> 
    <a:extLst> 
     <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}"> 
     <a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0"/> 
     </a:ext> 
    </a:extLst> 
    </a:blip> 
    <a:srcRect/> 
    <a:stretch> 
    <a:fillRect/> 
    </a:stretch> 
</pic:blipFill>` 

XML-Code für das Bild mit Unschärfe:

<pic:blipFill> 
    <a:blip r:embed="rId11"> 
    <a:extLst> 
     <a:ext uri="{BEBA8EAE-BF5A-486C-A8C5-ECC9F3942E4B}"> 
     <a14:imgProps xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main"> 
      <a14:imgLayer r:embed="rId12"> 
      <a14:imgEffect> 
       <a14:sharpenSoften amount="-50000"/> 
      </a14:imgEffect> 
      </a14:imgLayer> 
     </a14:imgProps> 
     </a:ext> 
     <a:ext uri="{28A0092B-C50C-407E-A947-70E740481C1C}"> 
     <a14:useLocalDpi xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main" val="0"/> 
     </a:ext> 
    </a:extLst> 
    </a:blip> 
    <a:srcRect/> 
    <a:stretch> 
    <a:fillRect/> 
    </a:stretch> 
</pic:blipFill> 

Aus den obigen Codes mit und ohne Unschärfen, es klar ist, dass der folgende Code der einzige Unterschied zwischen ihnen

<a14:imgProps xmlns:a14="http://schemas.microsoft.com/office/drawing/2010/main"> 
    <a14:imgLayer r:embed="rId12"> 
    <a14:imgEffect> 
     <a14:sharpenSoften amount="-50000"/> 
    </a14:imgEffect> 
    </a14:imgLayer> 
</a14:imgProps> 

ich in der Lage bin zuzugreifen, ist den Tag bis "A: ext", siehe unten Code

trans = r.xpath('.//w:drawing/wp:inline/a:graphic/a:graphicData/' 
       'pic:pic/pic:blipFill/a:blip/a:extLst/a:ext') 

und trans ist der Parameter Rückkehr

<CT_PositiveSize2D '<a:ext>' at 0x4535db8> 

Wenn ich Zugriff bin versucht, um die nächste Stufe Stichwort "a14: imgProps" nach "a: ext" ist es den folgenden Fehler

Datei werfen "C: \ Python27 \ Lib \ site-packages \ docx \ OXML \ xmlchemy.py", Linie 751, in XPath xpath_str, Namensräume = nsmap

File " src \ lxml \ etre e.pyx ", Zeile 1589, in lxml.etree._Element.xpath (src \ lxml \ etree.c: 61221)

Datei" src \ lxml \ xpath.pxi ", Zeile 307, in lxml.etree. XPathElementEvaluator. Anruf (src \ lxml \ etree.c: 178760)

Datei "src \ lxml \ xpath.pxi", Linie 227, in lxml.etree._XPathEvaluatorBase._handle_result (src \ lxml \ etree.c: 177712

)

XPathEvalError: Nicht definiert Namespacepräfix

Da ich die Parameter "a14: sharpenSoften" dachte Zugriff wird hilfreich sein, um das Bild zu verwischen. Aber ich weiß nicht, wie man auf diesen Parameter zugreift.

Kann mir jemand helfen, auf den Parameter "a14: sharpenSoften" zuzugreifen ODER wenn es eine andere Methode gibt, um das Bild unter bestimmten Überschrift, Absatz oder Tabellen zu verwischen, lassen Sie mich darüber wissen.

Hinweis: Ich verwende Python docx-Modul und Python 2.7

+0

Es ist nicht klar, was Ihre Frage ist. "Wie kann ich auf den Parameter zugreifen?" <- was heißt das überhaupt? Bearbeiten Sie einfach das XML, wenn Sie einen anderen Wert wünschen. –

+0

Wie von @ M.Prokhorov angegeben, ist diese Frage sehr vage, und wir wissen nicht, was Sie erreichen möchten, lesen Sie bitte [wie Sie eine Frage stellen] (https://stackoverflow.com/help/how-to-ask) und bearbeiten Sie Ihre Frage, um das [minimale, vollständige und überprüfbare Beispiel] (https://stackoverflow.com/help/how-to-ask) zu verdeutlichen und einzubeziehen. Dies gibt uns eine bessere Vorstellung davon, was Sie erreichen wollen und was Sie bisher versucht haben. –

+0

Ich habe die Fragen bearbeitet, können Sie es bitte jetzt überprüfen und lassen Sie mich wissen, wenn Sie weitere Informationen benötigen – Ammu

Antwort

0

Sie diesen Fehler r.xpath() indem Sie die folgenden Zeilen vor dem Aufruf überwinden:

import docx 
docx.oxml.ns.nsmap['a:14'] = "http://schemas.microsoft.com/office/drawing/2010/main" 

Dann ist dieser Code ermöglicht es Ihnen, die a14:sharpenSoften einstellen Attribut:

xpath_str = (
    './/w:drawing/wp:inline/a:graphic/a:graphicData/pic:pic/pic:blipFill' 
    '/a:blip/a:extLst/a:ext/a14:imgProps/a14:imgLayer/a14:imgEffect/a14:' 
    'sharpenSoften' 
) 
sharpenSoftens = r.xpath(xpath_str) 
if not sharpenSoftens: # then that element is not found 
    return 
sharpenSoften = sharpenSoftens[0] 
sharpenSoften.set('amount', '-50000') 
+0

Ich kann bis zum Pfad navigieren trans = r.xpath ('.//w/drawing/wp:inline/a:graphic/a:graphicData/' 'Bild: Bild/Bild: blipFill/a: blip/a: extLst/a: ext/a14: imgProps/a14: imgLayer/a14: imgEffect/a14: sharpenSoften ') Können Sie sagen, wie man den Wert set = "- 50000" es kann sehr einfach sein, aber ich bin neu zu python und xml – Ammu

+0

Ich habe Beispielcode zu meiner Antwort hinzugefügt. Vernachlässige es nicht, diese Antwort zu wählen, wenn es hilfreich ist und akzeptiere sie, wenn sie deine Frage beantwortet. – scanny

+0

Es gibt einen Fehler "IndexError: Liste Index außerhalb des Bereichs" für den Code sharpenSoften = sharpenSoftens [0] – Ammu