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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top