salto - ¿Alguien ha descubierto una forma de presentar un informe de Reporting Services con una resolución superior a 96ppi?
parametros reporting services (6)
He intentado todo lo que puedo pensar para cambiar los parámetros de representación para un informe que necesito presentar como 300ppi TIFF.
Aquí hay uno de varios intentos usando el enfoque de URL. A medida que pasamos de 96ppi a 300ppi, el tamaño de la imagen de 8,5 x 11 aumenta drásticamente, pero la resolución se mantuvo en 96ppi.
//s0550284/ReportServer?/ERecordingReports/Report1&rs:Format=IMAGE&rc:DpiX=300&rc:DpiY=300&rc:PageHeight=11in&rc:PageWidth=8.5in&rs:Command=Render
Hemos intentado cambiar los archivos de configuración de SSRS para cambiar el valor predeterminado de 96ppi a 300ppi, pero el cambio se ignora.
Está empezando a parecer que alguien ha codificado 96ppi en algún lugar donde no puede ser anulado.
Estamos ejecutando SQL Server 2008 R2.
Cualquier idea sobre cómo superar este problema sería muy apreciada.
-Tom
Con la ayuda de los encuestados aquí y en otros foros, encontré un truco simple que parece resolver mi problema. Vino a mí después de que abandoné la pelea con SSRS. Estoy seguro de que hay muchas razones perfectamente válidas sobre por qué SSRS maneja diferentes parámetros de resolución como lo hace. Francamente, no me importa un comino. Solo necesito que mi documento se genere con el tamaño y la resolución que especifiqué.
Aquí están las piezas de código relevantes (se elimina el manejo del error por razones de brevedad). Invoco SSRS a través de la interfaz del servicio web, genero el informe y lo presento como 300 x 300 TIFF. Los resultados se guardan temporalmente. Se habrá generado como un TIFF de 96ppi y ampliado. Luego lo leo en un BitMap, cambio la resolución a 300 x 300 y la vuelvo a escribir. Hecho.
string deviceInfo = "<DeviceInfo> <OutputFormat>TIFF</OutputFormat> <DpiX>300</DpiX> <DpiY>300</DpiY> <PrintDpiX>300</PrintDpiX> <PrintDpiY>300</PrintDpiY> </DeviceInfo>";
string format = "IMAGE";
Byte[] results;
string mimeType = "image/tiff";
// Generate the report as a TIF
ExecutionInfo ei = new ExecutionInfo();
ei = rsExec.LoadReport(_reportName, historyID);
results = rsExec.Render(format, deviceInfo, out extension, out encoding, out mimeType, out warnings, out streamIDs);
string TempFileRSGeneratedTIFF = TempPath + "RSGeneratedTIFF.TIF";
// Save tiff file returned by RS
using (FileStream stream = File.OpenWrite(TempFileRSGeneratedTIFF))
{
stream.Write(results, 0, results.Length);
}
// Read tif file into bitmap
Bitmap image = new Bitmap(TempFileRSGeneratedTIFF);
// Change the resolution to what it was supposed to be in the first place..
image.SetResolution(300, 300);
// Save the final version of the file
image.Save(DestFileName, System.Drawing.Imaging.ImageFormat.Tiff);
image.Dispose();
Pude hacer esto fácilmente en SSRS 2008 R2 editando el archivo rsreportserver.config:
<Extension Name="IMAGE" Type="Microsoft.ReportingServices.Rendering.ImageRenderer.ImageRenderer,Microsoft.ReportingServices.ImageRendering" />
<Extension Name="TIFF 200 DPI" Type="Microsoft.ReportingServices.Rendering.ImageRenderer.ImageRenderer,Microsoft.ReportingServices.ImageRendering">
<OverrideNames>
<Name Language="en-US">TIFF 200 DPI</Name>
</OverrideNames>
<Configuration>
<DeviceInfo>
<ColorDepth>32</ColorDepth>
<DpiX>200</DpiX>
<DpiY>200</DpiY>
<OutputFormat>TIFF</OutputFormat>
</DeviceInfo>
</Configuration>
</Extension>
<Extension Name="TIFF 300 DPI" Type="Microsoft.ReportingServices.Rendering.ImageRenderer.ImageRenderer,Microsoft.ReportingServices.ImageRendering">
<OverrideNames>
<Name Language="en-US">TIFF 300 DPI</Name>
</OverrideNames>
<Configuration>
<DeviceInfo>
<ColorDepth>32</ColorDepth>
<DpiX>300</DpiX>
<DpiY>300</DpiY>
<OutputFormat>TIFF</OutputFormat>
</DeviceInfo>
</Configuration>
</Extension>
Tenga en cuenta que dejé intacta la extensión de IMAGEN original (aunque no era necesario) y agregué dos referencias más a esa extensión: una a 200 ppp y otra a 300 ppp. Los tres ahora aparecen en la lista desplegable de exportación en el Administrador de informes y funcionan correctamente. Tenga en cuenta que (siguiendo el ejemplo de Micorsoft) incluí el atributo ColorDepth, aunque SSRS lo ignora. También tenga en cuenta que utilicé el parámetro Idioma en el atributo Nombre. El artículo que estaba viendo dice que la configuración de anulación se ignorará si no incluye el parámetro de Idioma (no lo probó).
Intente reiniciar su ReportServer después de realizar los cambios en el archivo de configuración. Sigue el enlace a continuación.
No estoy seguro de tratar de cambiar la resolución una vez que haya exportado la imagen.
Configure el objeto de imagen para que sea externo (enlace en el servidor de informes) o en la base de datos, en lugar de incrustado en el informe.
Probé con el método de @Chuck Brevitt, pero Reporting Services de la API web no parecía respetar la configuración de DPI para la configuración de PDF. Encontré por experimentación y algunos consejos en notas de Microsoft que esto funcionó:
Para obtener una mejor representación de imágenes en PDF, pase la información del dispositivo de la siguiente manera:
http://serverName/ReportServer?/pathtoReport/ReportName&InvoiceIdOrOtherParameter=24013&rs:Command=Render&rs:Format=PDF&rs:DeviceInfo=<DpiX>300<%2FDpiX><DpiY>300<%2FDpiY>
Intenté todo bajo el sol para SSRS 2012, y me refiero a todo. Pero finalmente me di por vencido también. En la misma línea de Tom y un montón de Google, encontré http://csharphelper.com/blog/2017/09/change-image-resolution-c/
Este es el modelo de trabajo:
public static string BumpUpResolution(string filename, float dpiX, float dpiY, string processID)
{
int oldWidth = 0, oldHeight = 0;
Bitmap image = new Bitmap(filename);
oldWidth = image.Width;
oldHeight = image.Height;
using (Bitmap bm = new Bitmap(oldWidth, oldHeight))
{
Point[] points = {
new Point(0,0),
new Point(oldWidth, 0),
new Point(0, oldHeight),
};
using (Graphics gr = Graphics.FromImage(bm))
{
gr.DrawImage(image, points);
}
bm.SetResolution(dpiX, dpiY);
bm.Save(Path.Combine(Path.GetDirectoryName(filename), string.Format("{0}{1}", processID, Path.GetExtension(filename))), System.Drawing.Imaging.ImageFormat.Tiff);
}
image.Dispose();
return Path.Combine(Path.GetDirectoryName(filename), string.Format("{0}{1}", processID, Path.GetExtension(filename)));
}