# encoding: ascii
# api: powershell
# title: Out-Report
# description: Sends output to Excel, PDF, or Image files
# version: 8.5
# type: function
# author: Chad MIller
# license: CC0
# function: New-ImageDeviceInfo
# x-poshcode-id: 1015
# x-archived: 2016-03-05T02:00:13
# x-published: 2010-04-11T11:15:00
#
#
#Depends on Microsoft Report Viewer Redistributable and ReportExporters
#ReportExporters available at http://www.codeproject.com/KB/reporting-services/ReportExporters_WinForms.aspx
#Download demo version of ReportExporters for compiled dlls
#Tested with Microsoft Report Viewer 2008 SP1 Redistributable, although 2005 and base 2008 version should work
#Visual Studio installations as well as SQL Server Reporting Services may already include Microsoft Report Viewer
#Microsoft Report Viewer Redist available at http://www.microsoft.com/downloads/details.aspx?familyid=BB196D5D-76C2-4A0E-9458-267D22B6AAC6&displaylang=en
#EXAMPLES
#get-alias | ./out-report.ps1 "c:\users\u00\bin\aliases.xls" xls
#get-alias | ./out-report.ps1 "c:\users\u00\bin\aliases.pdf" pdf
#get-alias | ./out-report.ps1 "c:\users\u00\bin\aliases.jpeg" -filetype image -imagetype JPEG -height 22 -width 14

param($fileName,$fileType,$imageType,$height=11,$width=8.5)

$libraryDir = Convert-Path (Resolve-Path "$ProfileDir\Libraries")
[void][reflection.assembly]::LoadWithPartialName("Microsoft.ReportViewer.WinForms")
[void][Reflection.Assembly]::LoadFrom("$libraryDir\ReportExporters.Common.dll")
[void][Reflection.Assembly]::LoadFrom("$libraryDir\ReportExporters.WinForms.dll")

$fileTypes = 'XLS','PDF','IMAGE'
if (!($fileTypes -contains $fileType)) 
{ throw 'Valid file types are XLS, PDF, IMAGE' }

$imageTypes = 'BMP','EMF','GIF','JPEG','PNG','TIFF'
if ( $imageType -and !($imageTypes -contains $imageType)) 
{ throw 'Valid image types are BMP,EMF,GIF,JPEG,PNG or TIFF' }

#######################
function New-ImageDeviceInfo
{
    param($imageType,$height,$width)

    $deviceInfo = new-object ("ReportExporters.Common.Exporting.ImageDeviceInfoSettings") $imageType
    $deviceInfo.PageHeight = new-object System.Web.UI.WebControls.Unit($height,[System.Web.UI.WebControls.UnitType]::Inch)
    $deviceInfo.PageWidth = new-object System.Web.UI.WebControls.Unit($width,[System.Web.UI.WebControls.UnitType]::Inch)
    $deviceInfo.StartPage = 0
    return $deviceInfo

} #New-ImageDeviceInfo

#DataTable section from http://mow001.blogspot.com/2006/05/powershell-out-datagrid-update-and.html
$dt = new-Object Data.datatable  
  $First = $true  
  foreach ($item in $input){  
    $DR = $DT.NewRow()  
    $Item.PsObject.get_properties() | foreach {  
      If ($first) {  
        $Col =  new-object Data.DataColumn  
        $Col.ColumnName = $_.Name.ToString()  
        $DT.Columns.Add($Col)       }  
      if ($_.value -eq $null) {  
        $DR.Item($_.Name) = "[empty]"  
      }  
      ElseIf ($_.IsArray) {  
        $DR.Item($_.Name) =[string]::Join($_.value ,";")  
      }  
      Else {  
        $DR.Item($_.Name) = $_.value  
      }  
    }  
    $DT.Rows.Add($DR)  
    $First = $false  
  } #End DataTable section  

$ds = new-object System.Data.dataSet 
$ds.merge($dt)
$dsaProvider = new-object ReportExporters.Common.Adapters.DataSetAdapterProvider $ds
$dsa = $dsaProvider.GetAdapters()
$reportExporter = new-object ReportExporters.WinForms.WinFormsReportExporter $dsa

switch ($fileType)
{
    'XLS'   { $content =$reportExporter.ExportToXls() }
    'PDF'   { $content = $reportExporter.ExportToPdf() }
    'IMAGE' { $deviceInfo = New-ImageDeviceInfo $imageType $height $width; $content =  $reportExporter.ExportToImage($deviceInfo) }
}

[System.IO.File]::WriteAllBytes($fileName,$content.ToArray())
