Adicionando caminho relativo para um gráfico externo em um documento XSL?
Pergunta
Primeiro, não sei muito sobre XSL.
Estou usando um aplicativo chamado DITA para gerar PDFs. Uma das coisas que exige é uma substituição de um arquivo XSL; Para adicionar estilo personalizado.
Estou tentando adicionar um gráfico externo usando um caminho relativo. Não funciona, a menos que eu forneça o caminho completo.
Não funciona:
<fo:block text-align="center" width="100%">
<fo:external-graphic src="../../images/logo.png"/>
</fo:block>
Funciona:
<fo:block text-align="center" width="100%">
<fo:external-graphic src="/absolute/path/to/images/logo.png"/>
</fo:block>
Eu olhei na web, disse para usar "Arquivo: Image.png" e outro site disse usar "URL (image.png)", mas nenhum deles funcionou.
O que estou fazendo errado?
Solução
Esta é uma pergunta antiga, mas algo que muitas vezes é mal interpretado ao trabalhar com Dita-OT.
O importante a saber é que o caminho graphic externo é relativo à arte dita-ot.dir.
Posso pensar em duas maneiras de adicionar o logotipo.
O caminho fácil
Copiar logo.png no arwork Diretory
DITA-OT/demo/fo/cfg/common/artwork/logo.png
Altere seu caminho gráfico XSL para
<fo:block text-align="center" width="100%">
<fo:external-graphic src="Configuration/OpenTopic/cfg/common/artwork/logo.png"/>
</fo:block>
Da maneira mais difícil
É possível alterar o diretório de obras de arte do qual a Dita tira as fotos e o diretório de saída que será usado pelo FOP para renderizar o PDF.
Abra o arquivo build.xml
DITA-OT/demo/fo/build.xml
Raiz de obras de arte
Defina o diretório raiz onde o Dita deve copiar a obra de arte para o padrão
<property name="artwork.dir" value="${dita.map.output.dir}"/>
Que definirá a raiz para onde seu PDF final será salvo.
Destino de arte
Defina o caminho em que os arquivos devem ser armazenados em relação ao diretório raiz da obra de arte
<copy todir="${coreArtworkDestinationDir}/Configuration/OpenTopic"
Por padrão, ele criará as pastas /Configuration/OpenTopic
e depois copie tudo lá, incluindo sub -diretórios.
Certifique -se de alterar o destino duas vezes. Os dois lugares que você precisa editar estão a apenas algumas linhas.
Fonte de obras de arte
Defina onde a obra de arte original é salva para que o Dita-OT possa copiar os arquivos para o destino.
A primeira linha aponta para a obra de arte padrão que acompanha o dita-ot e não deve ser alterada.
<fileset dir="${basedir}" includes="cfg/common/artwork/**/*.*"/>
O segundo destina -se a personalizar, sendo o que deve ser usado para personalização.
<fileset dir="${customization.dir}" includes="common/artwork/**/*.*"/>
O caminho é relativo a dita-ot/demonstração/fo/personalização.
Outras dicas
Eu tive um problema semelhante e descobri em outro fórum que o problema é o formulário para atribuir o caminho "baseado", porque o caminho baseado deve ter o prefixo "arquivo:".
Aqui um método em C# para criar um PDF com imagens:
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;
}
Cumprimentos! Gabriel.
Eu diria que você tem um conflito entre onde pensa que está e onde o mecanismo de processamento pensa que é. Caminhos absolutos sempre funcionam. Tente verificar o local 'atual' e você verá o que está acontecendo.
O caminho é relativo à localização do documento XML, não à localização da folha de estilo.
Você precisa definir baseDir
Antes de referenciar qualquer recurso externo. este A postagem pode ajudá -lo nisso.