Hinzufügen relativen Pfad für eine externe Grafik in einem XSL-Dokument?
Frage
zuerst, ich weiß nicht viel über XSL.
Ich verwende eine App DITA genannt pdfs zu erzeugen. Eines der Dinge, die es erfordert, ist ein Überschreiben einer XSL-Datei; Custom-Styling hinzuzufügen.
Ich versuche, eine externe Grafik mit einem relativen Pfad hinzuzufügen. Es funktioniert nicht, wenn ich nicht den vollständigen Pfad liefern.
funktioniert nicht:
<fo:block text-align="center" width="100%">
<fo:external-graphic src="../../images/logo.png"/>
</fo:block>
funktioniert:
<fo:block text-align="center" width="100%">
<fo:external-graphic src="/absolute/path/to/images/logo.png"/>
</fo:block>
ich im Internet sehe, sagte, es zu benutzen "file: image.png". Und andere Website sagte verwenden "url (image.png)", aber weder gearbeitet
Was mache ich falsch?
Lösung
Dies ist eine alte Frage, aber etwas, das oft falsch verstanden wird, wenn sie mit DITA-OT arbeiten.
Die wichtige Sache zu wissen ist, dass der externe Grafik Pfad zum DITA-OT artwork.dir relativ ist.
kann ich zwei Möglichkeiten denken, um das Logo zu tun hinzuzufügen.
Die einfache Art und Weise
Kopieren logo.png in die arwork Diretory
DITA-OT/demo/fo/cfg/common/artwork/logo.png
Ändern Sie Ihre xsl Grafik Pfad
<fo:block text-align="center" width="100%">
<fo:external-graphic src="Configuration/OpenTopic/cfg/common/artwork/logo.png"/>
</fo:block>
Je härter Weg
Es ist möglich, das Kunstwerk Verzeichnis zu ändern, von dem DITA ihm der Bilder sowie das Ausgabeverzeichnis nimmt die von FOP verwendet wird, um das PDF zu machen.
Öffnen Sie die Datei build.xml
DITA-OT/demo/fo/build.xml
Grafik root
Definieren Sie das Wurzelverzeichnis, in den DITA die Grafik kopieren soll Die Standardeinstellung ist
<property name="artwork.dir" value="${dita.map.output.dir}"/>
, die die Wurzel, wo Sie Ihre endgültige PDF wird gespeichert gesetzt werden.
Grafik Ziel
Definieren Sie den Pfad, in dem die Dateien in das Kunstwerk Stammverzeichnis relativ gespeichert werden sollen
<copy todir="${coreArtworkDestinationDir}/Configuration/OpenTopic"
Standardmäßig wird es schafft die Ordner /Configuration/OpenTopic
und kopieren Sie dann alles in dort mit Unterverzeichnissen.
Stellen Sie sicher, zweimal das Ziel zu ändern. Die beiden Orte, die Sie bearbeiten haben, sind nur ein paar Zeilen auseinander.
Grafik Quelle
definieren, wo die Originalvorlage gespeichert wird, so dass DITA-OT die Dateien auf das Ziel kopieren.
Die erste Zeile zeigt auf das Standardkunstwerk, das mit DITA-OT kommen und soll nicht geändert werden.
<fileset dir="${basedir}" includes="cfg/common/artwork/**/*.*"/>
Die zweite sollte somit zum Anpassen der eine sein, die individuell verwendet werden soll.
<fileset dir="${customization.dir}" includes="common/artwork/**/*.*"/>
Der Pfad ist relativ zu DITA-OT / demo / fo / Customization.
Andere Tipps
Ich hatte ein ähnliches Problem und in einem anderen Forum entdeckt, dass Problem ist die Form des „baseDir“ Pfad zuweisen, da der baseDir Pfad das Präfix haben muss „file:“.
Hier ist eine Methode in C # ein PDF mit Bildern zu erstellen:
private string CreatePDF(string fileToCreate, string templateFile)
{
org.apache.fop.configuration.Configuration.put("baseDir", "file:" + AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings["ImagesPath"] + @"\");
//Load the style sheet.
XslCompiledTransform xslt = new XslCompiledTransform();
xslt.Load(templateFile);
//Execute the transform and output the results to a file.
xslt.Transform(fileToCreate, "temp.fo");
FileInputStream streamFO = new FileInputStream("temp.fo");
InputSource src = new InputSource(streamFO);
string pdfFilesPath = ConfigurationManager.AppSettings["PDFFilesPath"];
if (!Directory.Exists(pdfFilesPath))
{
Directory.CreateDirectory(pdfFilesPath);
}
pdfFilesPath = AppDomain.CurrentDomain.BaseDirectory + ConfigurationManager.AppSettings["PDFFilesPath"];
string fileName = fileToCreate.Substring(fileToCreate.LastIndexOf(@"\") + 1, fileToCreate.LastIndexOf(".") - 1 - fileToCreate.LastIndexOf(@"\")) + ".PDF";
FileOutputStream streamOut = new FileOutputStream(pdfFilesPath + @"\" + fileName);
Driver driver = new Driver(src, streamOut);
driver.setRenderer(1);
driver.run();
streamOut.close();
return fileName;
}
Viele Grüße! Gabriel.
Ich würde sagen, Sie einen Konflikt zwischen haben, wo Sie denken, Sie sind und wo die Verarbeitungsmaschine denkt es ist. Absolute Pfade immer funktionieren. Versuchen Sie, ‚aktuelle‘ Position zu überprüfen und Sie werden sehen, was los ist.
Der Pfad ist relativ zum Speicherort des XML-Dokuments, nicht die Lage des Stylesheets.
Sie müssen Set baseDir
, bevor sie eine externe Ressource verweist. diese Post können Sie auf diese Hilfe.