Generate PDF using SSRS
While looking for a method to programmatically generate PDF I came across the possibility of using SQL Server Reporting Services for the job. It actually has a number of possible rendering options, among them are "XML, NULL, CSV, IMAGE, PDF, HTML4.0, HTML3.2, MHTML, EXCEL, and HTMLOWC".
The problem with generating PDF is that there are two components to the document, the format and the data. The format part is the real pain that on has to deal with, date can then simply put in placeholders. SSRS simplifies this by allowing you to generate the PDF report by first creating the report, using some data from the database, in its own designer. Once the report is designed you can use the web services exposed by reporting services to save it any of those formats.
The SSRS web service can be found at http://server/reportserver/reportservice.asmx
After adding this service reference you will find the following nifty function for rendering the report in any format you like.
public Byte[] Render(
string Report,
string Format,
string HistoryID,
string DeviceInfo,
[Namespace].ParameterValue[] Parameters,
[Namespace].DataSourceCredentials[] Credentials,
string ShowHideToggle,
out string Encoding,
out string MimeType,
out [Namespace].ParameterValue[] ParametersUsed,
out [Namespace].Warning[] Warnings
out string[] StreamIds);
Member of [Namespace].ReportingService
According to the documentation the parameters are defined as following:
Parameters
- Report
- The full path name of the report.
- Format
- The format in which to render the report. This argument maps to a rendering extension. Supported extensions are XML, NULL, CSV, IMAGE, PDF, HTML4.0, HTML3.2, MHTML, EXCEL, and HTMLOWC.
- HistoryID
- Optional. The unique identifier of a report history snapshot to render for the specified report. The identifier is based on the date and time the report history was created.
- DeviceInfo
- An XML string that contains the device-specific content that is required by the rendering extension specified in the Format parameter. For more information about device information settings for specific output formats, see Device Information Settings.
- Parameters
- Optional. An array of ParameterValue[] objects that represent the report-specific parameters.
- Credentials
- Optional. An array of DataSourceCredentials[] objects that contains the data source credentials.
- ShowHideToggle
- Optional. The Show/Hide toggle ID.
- Encoding
- [out] The encoding used when report server renders the contents of the report.
- MimeType
- [out] The MIME type of the rendered report.
- ParametersUsed
- [out] An array of ParameterValue[] objects representing the query parameters, if any, that are stored along with the report. This parameter returns a value only if the report being rendered is a report history snapshot.
- Warnings
- [out] An array of Warning[] objects that describes any warnings that occurred during report processing.
- StreamIds
- [out] The stream identifiers. These IDs are passed to the RenderStream method. You can use them to render the external resources (images, etc.) that are associated with a given report.
Return Value
A Byte[] array of the report in the specified format. For more information about this data type, see "Byte Structure" in the .NET Framework documentation.
The following piece of code may be used to generate a PDF of the report you created.
private void RenderTest_Click(object sender, System.EventArgs e)
{
RSWebReference.ReportingService rs = new RSWebReference.ReportingService();
rs.Credentials = System.Net.CredentialCache.DefaultCredentials;
Byte[] result;
string encoding;
string mimetype;
ParameterValue[] parametersUsed;
Warning[] warnings;
string[] streamids;
result = rs.Render("/SampleReports/Company Sales","PDF",null,null,null,null,null,out encoding,out mimetype,out parametersUsed,out warnings,out streamids);
Response.ClearContent();
Response.AppendHeader("content-length", result.Length.ToString());
Response.ContentType = "application/pdf";
Response.BinaryWrite(result);
Response.Flush();
Response.Close();
}
If the reporting service is not satisfying your requirements or you simply don't have reporting service available then you can use on of the following libraries to generate PDF through your own code: C# open-source PDF Libraries
Render Method on MSDN
PDF Generation KB