2012-04-04 10 views
8

Dato un file di definizione del report SSRS con un'immagine incorporata al suo interno, mi chiedo solo se è possibile estrarre quell'immagine XML per ricreare il file immagine originale.È possibile estrarre l'immagine incorporata in un file?

ad es. :

all'interno del file rdlc, si potrebbe vedere xml come questo:

<EmbeddedImage Name="tick"> 
    <MIMEType>image/bmp</MIMEType> 
    <ImageData>Qk1mAwAAAAAAADYAAAAoAAAAEAAAABEAAAABABgA ... <<REST OF IMAGE HERE>> 
    </ImageData> 
</EmbeddedImage> 

E 'possibile prendere l'ImageData, e trasformare forma in qualche modo per ricreare il flusso originale di byte un'immagine bitmap?

(questo potrebbe essere utile in casi come quando hai perso il file di immagine originale su cui si fonda l'immagine incorporata.)

risposta

13

due approcci sono dettagliate nel this blog post:

  1. Copiare il immagine codificata da una relazione all'altra se è necessario riutilizzarla lì.
  2. Esportare una copia del report in Excel e copiare l'immagine dal foglio di calcolo.

O se è necessario accedere direttamente all'immagine, ho trovato this utility che analizzerà l'XML e caricherà ed esporterà le immagini. Sembra che il codice sorgente sia disponibile.

+1

grazie, l'utilità funziona bene. Era necessaria una leggera modifica per far funzionare anche i file rdlc (incluso il file * .rdlc filespec nella finestra di dialogo di apertura del file). –

1

Avevo solo bisogno di fare questo e ho capito che è possibile tagliare e incollare l'immagine incorporata, anche se non è possibile copiare e incollare.

5

Ho creato un piccolo script Power Shell per risolvere questo problema:

$ErrorActionPreference = 'Stop'; 
Get-ChildItem -Filter '*.rdl' | ForEach { 
    $reportFile = $_; 
    Write-Host $reportFile; 
    $report = [xml](Get-Content $reportFile); 
    $report.Report.EmbeddedImages.EmbeddedImage | Foreach { 
     $imagexml = $_; 
     $imageextension = $imagexml.MIMEType.Split('/')[1]; 
     $filename = $imagexml.Name + '.' + $imageextension; 
     Write-Host '->' $filename; 
     $imageContent = [System.Convert]::FromBase64String($imagexml.ImageData); 
     Set-Content -Path $filename -Encoding Byte -Value $imageContent; 
    } 
} 

https://gist.github.com/Fabian-Schmidt/71746e8e1dbdf9db9278

Questo script estrae tutte le immagini da tutti i rapporti nella cartella corrente.

+0

Lifesaver - grazie! – CamM

Problemi correlati