2012-04-04 15 views
8

Biorąc pod uwagę plik definicji raportu SSRS z osadzonym obrazem, zastanawiasz się, czy możliwe jest wyodrębnienie tego obrazu XML w celu odtworzenia oryginalnego pliku obrazu.Możliwe do wyodrębnienia osadzonego obrazu do pliku?

np. :

wewnątrz pliku RDLC, można zobaczyć xml jak poniżej:

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

to możliwe, aby wziąć imageData i przekształcić formę go w jakiś sposób, aby ponownie stworzyć oryginalny obraz mapy bitowej strumienia bajtów?

(Może to być przydatne w przypadkach, na przykład gdy straciłeś oryginalny plik obrazu, na którym został oparty osadzony obraz.)

Odpowiedz

13

dwa podejścia są wyszczególnione w this blog post:

  1. Skopiować zakodowany obraz z jednego raportu do drugiego, jeśli trzeba go tam ponownie wykorzystać.
  2. Wyeksportuj kopię raportu do programu Excel i skopiuj obraz z arkusza kalkulacyjnego.

Jeśli potrzebujesz bardziej bezpośredniego dostępu do obrazu, znalazłem this utility, który przeanalizuje kod XML i załaduje i wyeksportuje obrazy. Wygląda na to, że kod źródłowy jest dostępny.

+1

dzięki, narzędzie działa dobrze. Wymagana była niewielka zmiana, aby działała również na pliki rdlc (w tym plik * .rdlc filespec w otwartym oknie dialogowym pliku). –

1

Po prostu musiałem to zrobić i zdałem sobie sprawę, że możliwe jest wycięcie i wklejenie osadzonego obrazu, mimo że nie można go kopiować i wklejać.

5

Stworzyłem mały skrypt powłoki mocy, aby rozwiązać ten problem:

$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

Ten skrypt pobiera wszystkie obrazy z wszystkich raportów w bieżącym folderze.

+0

Lifesaver - dzięki! – CamM

Powiązane problemy