XSL文書内の外部グラフィックの相対パスを追加しますか?
質問
最初の、私はXSLについて多くを知らない。
私は、PDFを生成するために、DITAと呼ばれるアプリを使用しています。それが必要との事の一つは、XSLファイルの上書きです。カスタムスタイルを追加します。
私は、相対パスを使用して、外部のグラフィックを追加しようとしています。また、私は完全なパスを供給しない限り、動作しません。
んではない仕事ます:
<fo:block text-align="center" width="100%">
<fo:external-graphic src="../../images/logo.png"/>
</fo:block>
ん仕事ます:
<fo:block text-align="center" width="100%">
<fo:external-graphic src="/absolute/path/to/images/logo.png"/>
</fo:block>
私はそれが「ファイル:image.png」を使用すると、ウェブ上で見て、他のウェブサイトは、「URL(image.png)」を使用するように言ったが、どちらも働いた。
。私は間違って何をしているのですか?
解決
この古い質問が、DITA-OTでの作業時にしばしば誤解されているものです。
知っておくことは重要なことは、外部のグラフィックパスは、DITA-OT artwork.dirに相対的であるということです。
私は、ロゴを追加行うには、2つの方法を考えることができます。
簡単
コピーlogo.png arwork diretory
へDITA-OT/demo/fo/cfg/common/artwork/logo.png
タグにあなたのXSLグラフィックパスを変更
<fo:block text-align="center" width="100%">
<fo:external-graphic src="Configuration/OpenTopic/cfg/common/artwork/logo.png"/>
</fo:block>
困難な方法
DITAは、PDFをレンダリングするためにFOPで使用される出力ディレクトリとしてだけでなく、それの写真を撮る、そこからアートワークディレクトリを変更することが可能です。
build.xmlファイルを開く
DITA-OT/demo/fo/build.xml
アートワークルート
DITAはにアートワークをコピーする必要があり、ルートディレクトリを定義します。 デフォルトは
<property name="artwork.dir" value="${dita.map.output.dir}"/>
最終的なPDFが保存される場所へのルートを設定します。。
アートワーク先
ファイルは、アートワークのルートディレクトリからの相対保存するパスを定義します。
<copy todir="${coreArtworkDestinationDir}/Configuration/OpenTopic"
デフォルトでは、フォルダの/Configuration/OpenTopic
を作成し、サブディレクトリを含むそこにすべてをコピーします。
二回先を変更することを確認します。編集するあなたが持っている2つの場所が離れてわずか数行です。
アートワークのソース
オリジナルのアートワークは、DITA-OTは、先にファイルをコピーすることができるように保存されている。ここで、を定義します。
DITA-OTが付属しており、変更すべきではありませんデフォルトのアートワークへの最初の行を指します。
<fileset dir="${basedir}" includes="cfg/common/artwork/**/*.*"/>
はもう一つは、カスタマイズのために使用されるべきものをこのようにカスタマイズすることを意図しています。
<fileset dir="${customization.dir}" includes="common/artwork/**/*.*"/>
は、パスはDITA-OT /デモ/ FO /カスタマイズに対するものです。
他のヒント
私は同様の問題を持っていたし、問題がBASEDIRパスは、接頭辞「ファイル:」持っている必要がありますので、「BASEDIR」パスを割り当てるためのフォームであることを別のフォーラムで発見ます。
ここでは画像付きPDFを作成するには、C#での方法:
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;
}
よろしく! ガブリエルます。
私はあなたがあなたがいると思うとどこ処理エンジンは、それがあると考えているとの競合を持っていると思います。絶対パスは常に働きます。 「現在」の位置を確認するために試してみて、あなたは何が起こっているかがわかります。
パスは、XML文書の場所ではなく、スタイルシートの位置に対して相対的である。
あなたは、任意の外部リソースを参照する前にセットbaseDir
する必要があります。 このの投稿はこの上であなたを助けることができます。