首先,我对XSL知之甚少。
我正在使用名为DITA的应用来生成pdfs。它需要的一件事是覆盖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)”,但都没有用。
我做错了什么?
答案 0 :(得分:3)
这是一个老问题,但在使用DITA-OT时常常被误解 重要的是要知道外部图形路径是相对于DITA-OT artwork.dir。
我可以想到两种方法来添加徽标。
将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获取图片的图稿目录以及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相关。
答案 1 :(得分: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;
}
问候! 加布里埃尔。
答案 2 :(得分:0)
我会说你认为自己所处的位置与处理引擎认为的位置之间存在冲突。绝对路径始终有效。尝试验证“当前”位置,您将看到正在发生的事情。
答案 3 :(得分:0)
路径相对于XML文档的位置,而不是样式表的位置。
答案 4 :(得分:0)
在引用任何外部资源之前,您需要设置baseDir
。 This帖子可以为您提供帮助。