2

まず、私は XSL についてあまり知りません。

私はDITAというアプリを使ってPDFを生成しています。必要なことの 1 つは、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>

私はウェブを見て、「file:image.png」を使用すると言い、他のウェブサイトは「url(image.png)」を使用すると言いましたが、どちらも機能しませんでした。

私は何を間違っていますか?

4

5 に答える 5

4

これは古い質問ですが、DITA-OT を使用する際によく誤解されることがあります。
知っておくべき重要なことは、external-graphic パスが DITA-OT artwork.dir に対して相対的であることです。

ロゴを追加するには 2 つの方法が考えられます。

簡単な方法

logo.png を arwork ディレクトリにコピーします。

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 が画像を取得するアートワーク ディレクトリと、FOP が PDF をレンダリングするために使用する出力ディレクトリを変更することができます。

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 回変更してください。編集する必要がある 2 つの場所は、数行しか離れていません。

アートワークのソース

元のアートワークの保存場所を定義して、DITA-OT がファイルをコピー先にコピーできるようにします。
最初の行は、DITA-OT に付属するデフォルトのアートワークを指しており、変更しないでください。

<fileset dir="${basedir}" includes="cfg/common/artwork/**/*.*"/>

2 番目はカスタマイズ用であるため、カスタマイズに使用する必要があります。

<fileset dir="${customization.dir}" includes="common/artwork/**/*.*"/>

パスは DITA-OT/demo/fo/Customization からの相対パスです。

于 2011-05-04T17:32:09.157 に答える
1

同様の問題があり、別のフォーラムで、baseDirパスにプレフィックス「file:」が必要なため、「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;
   }

よろしく!ガブリエル。

于 2012-01-05T02:03:14.793 に答える
0

自分がいると思う場所と処理エンジンが考える場所との間に矛盾があると思います。絶対パスは常に機能します。「現在」の場所を確認してみてください。何が起こっているかがわかります。

于 2010-03-08T15:18:18.307 に答える
0

baseDir外部リソースを参照する前に設定する必要があります。この投稿はこれに役立ちます。

于 2011-05-24T09:50:27.220 に答える
0

パスは、スタイルシートの場所ではなく、XML ドキュメントの場所に対する相対パスです。

于 2010-05-06T12:22:44.437 に答える