2

首先,我对 XSL 了解不多。

我正在使用一个名为 DITA 的应用程序来生成 pdf。它需要的一件事是覆盖 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 时经常被误解。
重要的是要知道外部图形路径是相对于 DITA-OT artifact.dir 的。

我可以想到两种添加徽标的方法。

简单的方法

将 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,然后复制其中的所有内容,包括子目录。
确保两次更改目的地。您必须编辑的两个地方仅相隔几行。

艺术品来源

定义原始图稿的保存位置,以便 DITA-OT 可以将文件复制到目标位置。
第一行指向 DITA-OT 附带的默认图稿,不应更改。

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

第二个用于定制,因此应该用于定制。

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

该路径相对于 DITA-OT/demo/fo/Customization。

于 2011-05-04T17:32:09.157 回答
1

我有一个类似的问题,并在另一个论坛中发现问题是分配“baseDir”路径的形式,因为baseDir 路径必须具有前缀“file:”。

这是 C# 中创建带有图像的 PDF 的方法:

   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

该路径相对于 XML 文档的位置,而不是样式表的位置。

于 2010-05-06T12:22:44.437 回答
0

您需要baseDir在引用任何外部资源之前进行设置。这篇文章可以帮助你。

于 2011-05-24T09:50:27.220 回答