Laden...

Interne Hyperlinks in PPTX via OpenXML

Erstellt von emtcho vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.052 Views
E
emtcho Themenstarter:in
16 Beiträge seit 2014
vor 9 Jahren
Interne Hyperlinks in PPTX via OpenXML

Moin,

ich habe versucht in eine via OpenXML erzeugte PPT Präsentation interne Hyperlinks hinzuzufügen (der Kunde wollte im Rahmen des Dokuments hin- und her "springen"). Leider ist der Part schlecht Dokumentiert.

Ich habe (nach Analyse der XML Beispielen bei MSDN) einfach in meinen AddShape Methode im RunProperties Teil ein HyperlinkOnClick hinzugefügt.



...

                                new RunProperties
                                    (
                                        new D.HyperlinkOnClick() { Action = "ppaction://hlinksldjump", Id = hyperlinkID},
                                        new D.SolidFill
                                        (
...

Das Problem ist, dass die Referenz-Erzeugung nicht wie erwartet Funktioniert.
Ich habe folgendes Probiert:


...
                    hyperlinkID = "rId_P" + q.ToString();
/*
... -> Aufruf Shape-Generierung und hyperlinkID Übergabe s.o. <-...
\*/

// Referenz Erzeugen... 
                    uri = new Uri("/ppt/slides/slide1.xml", UriKind.RelativeOrAbsolute);
                    hr = sld.Slide.SlidePart.AddHyperlinkRelationship(uri, false, hyperlinkID);
                    sld.Slide.Save();


Die C# Anweisung erzeugt nach XML-Serialisierung folgendes in der slide.xml:


...
<a:hlinkClick r:id="rId_P1" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" action="ppaction://hlinksldjump"/>
...

Und in der dazugehörige _rels Datei:

<Relationship Id="rId_P1" Target="/ppt/slides/slide1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink" TargetMode="External"/>

Man merkt sofort Hyperlink ist als "EXTERNAL" erzeugt obwohl in der Anweisung
hr = sld.Slide.SlidePart.AddHyperlinkRelationship(uri, false, hyperlinkID);
den Parameter isExternal explizit auf falsch steht...
Type ist als Hyperlink und nicht als Slide definiert ...

Hinzukommt dass, die PPTX ist "kaputt" ist und repariert werden will. Danach verschwinden die Links...

Ich habe per "reverse engineering" (interner Link im PPTX manuel erzeugt, entpackt und "reingeguckt") herausgefunden dass die dazugehörige XML wie folgt aussehen muss:


<a:hlinkClick r:id="rId3" action="ppaction://hlinksldjump"/>

und


...
<Relationship Target="slide1.xml" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/slide" Id="rId3"/>

aber wie schaffe ich das?

Diverses durchprobiert: URI - Einstellungen: Relative, Absolute, intern, extern - nichts führt zum gewünschten Ergebnis...

...

Meine Aufgabenstellung habe ich dadurch gelöst, dass zunächst via OpenXML die PPTX **schnell **erzeuge. (Die Shapes die mit Hyperlinks versehen werden müssen, bekommen spezielle Benennung).
Die Datei wird danach mit NetOffice geöffnet, die Slides/Shapes durchgegangen und die Links gesetzt...

Ich hätte aber gerne eine "saubere" - rein open XML Lösung.

Hat jemand ein Tipp?

Vielen Dank im Voraus!

emtcho