Pergunta

Já vi várias perguntas sobre como codificar um arquivo de imagem em base64, mas como sobre o contrário - como faço para reconstituir uma imagem de uma string base64 armazenadas em um arquivo XML

<resource>
<data encoding="base64">
R0lGODlhEAAQAPMAMcDAwP/crv/erbigfVdLOyslHQAAAAECAwECAwECAwECAwECAwECAwECAwEC
AwECAyH/C01TT0ZGSUNFOS4wGAAAAAxtc09QTVNPRkZJQ0U5LjAHgfNAGQAh/wtNU09GRklDRTku
MBUAAAAJcEhZcwAACxMAAAsTAQCanBgAIf8LTVNPRkZJQ0U5LjATAAAAB3RJTUUH1AkWBTYSQXe8
fQAh+QQBAAAAACwAAAAAEAAQAAADSQhgpv7OlDGYstCIMqsZAXYJJEdRQRWRrHk2I9t28CLfX63d
ZEXovJ7htwr6dIQB7/hgJGXMzFApOBYgl6n1il0Mv5xuhBEGJAAAOw==
</data>
<mime>image/gif</mime>
<resource-attributes>
    <file-name>clip_image001.gif</file-name>
</resource-attributes>
</resource>

Dado o XML nó resource acima, como faço para ir sobre como criar clip_image001.gif?

Por favor, sugerem:

  1. processadores e / ou extensões XSLT permitir isso, além
  2. a XSLT amostra que desencadeia a conversão

Note que ele deve ser capaz de lidar com pelo menos GIF e formatos de arquivo PNG. De preferência, não restrita a qualquer OS.


solução implementada

Com base em torno de solução Mads Hansen. Diferença sendo principal que eu referenciados net.sf.saxon.value.Base64BinaryValue diretamente no meu namespace ao invés de usar o namespace saxon, porque eu entendi a APIs Java de forma mais intuitiva do que as descrições do site do Saxonica das funções base64Binary-to-octets e base64Binary.

<xsl:stylesheet version="2.0" 
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
    xmlns:b64="net.sf.saxon.value.Base64BinaryValue"
    xmlns:fos="java.io.FileOutputStream"
    ...
    exclude-result-prefixes="b64 fos">
...
<xsl:for-each select="resource">                
    <xsl:variable name="b64" select="b64:new(string(data))"/>
    ...
    <xsl:variable name="fos" select="fos:new(string($img))"/>
    <xsl:value-of select="fos:write($fos, b64:getBinaryValue($b64))"/>  
    <xsl:value-of select="fos:close($fos)"/>
</xsl:for-each>
...

P.S. Consulte questão irmão para minha implementação de como obter os hashes necessários para identificar os arquivos de imagem.


Esta questão é um subquestão de outra pergunta eu pedi anteriormente .

Foi útil?

Solução

eu encontrei esta entrada do XSL maiing listas que descreve como usar o função Saxon extensão xs: base64Binary-a-octeto para transmiti-lo para um arquivo usando o Java FileOutputStream em um XSLT 2.0 folha de estilo:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform";
version="2.0" xmlns:xs="http://www.w3.org/2001/XMLSchema";
xmlns:saxon="http://saxon.sf.net/";
xmlns:fos="java.io.FileOutputStream">
<xsl:template match="/">
   <xsl:variable name="img" select="concat('c:\test\jesper', '.jpg')"/>
   <xsl:variable name="fos" select="fos:new(string($img))"/>
   <xsl:value-of select="fos:write($fos,
saxon:base64Binary-to-octets(xs:base64Binary(my-base64-encoded-image)))"/>
   <xsl:value-of select="fos:close($fos)"/>
</xsl:template>
</xsl:stylesheet>

Outras dicas

As seguintes obras:

<img>
  <xsl:attribute name="src">
    <xsl:value-of select="concat('data:image/gif;base64,',xPath)"/>
  </xsl:attribute>
</img>

transformá-lo em HTML.

<img src="data:{mime};base64,{data}" />

Existe um método melhor disponível desde Saxon 9.5 através do módulo de extensão EXPath arquivo (disponível em Saxon-PE e Saxon-EE).

Aqui está um fragmento do código que estou usando para extrair arquivos de imagem binários a partir de documentos do Word (fonte XML está no formato WordProcessingML):

<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:file="http://expath.org/ns/file" xmlns:pkg="http://schemas.microsoft.com/office/2006/xmlPackage">

<xsl:template match="/pkg:package">
    <xsl:apply-templates select="pkg:part/pkg:binaryData"/>
</xsl:template>

<xsl:template match="pkg:binaryData">
    <xsl:variable name="filename">
        <xsl:value-of select="replace(../@pkg:name, '/word/media/', '')"/>
    </xsl:variable>
    <xsl:variable name="path" select="concat('/some/folder/', $filename)"/>
    <xsl:message><xsl:value-of select="$path"/></xsl:message>

    <xsl:value-of select="file:write-binary($path, xs:base64Binary(string()))"/>       
</xsl:template>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top