Есть способ, и он занимает всего пару строк.Идея состоит в том, чтобы вызвать метод render существующего расширения рендеринга из нового расширения рендеринга.Это даст вам результат рендеринга в виде потока, который вы можете изменить.
Я не смог найти решение в Интернете, но нашел ответы на некоторых форумах, утверждающих, что это не может быть достигнуто.чтобы получить голову вокруг функции делегата, которая используется.Как только вы поймете, что происходит, решение становится простым.
Этот код протестирован с Reporting Services 2008. Этот метод очень полезен, если вы хотите изменить результаты рендеринга, созданные существующими расширениями рендеринга SSRS.Вы можете заменить строки, изменить вывод CSV в соответствии с вашими потребностями или, как в нашем случае, подписать или обновить PDF-документ.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.ReportingServices.OnDemandReportRendering;
using Microsoft.ReportingServices.Rendering.ImageRenderer;
using System.Globalization;
using System.IO;
using System.Net;
namespace ReportRendering.PDF
{
public class PdfWithBackgroundRenderer : IRenderingExtension
{
//Add the existing rendering extension to the new class
//In this case PDfRenderer from the ImageRenderer namespace
private PDFRenderer pdfRenderer;
//Stream to which the intermediate report will be rendered
private Stream intermediateStream;
private string _name;
private string _extension;
private Encoding _encoding;
private string _mimeType;
private bool _willSeek;
private Microsoft.ReportingServices.Interfaces.StreamOper _operation;
//Inititate the existing renderer in the constructor
public PdfWithBackgroundRenderer()
: base()
{
pdfRenderer = new PDFRenderer();
}
public void GetRenderingResource(Microsoft.ReportingServices.Interfaces.CreateAndRegisterStream createAndRegisterStreamCallback,
System.Collections.Specialized.NameValueCollection deviceInfo)
{
}
//New implementation of the CreateAndRegisterStream method
public Stream IntermediateCreateAndRegisterStream(string name, string extension, Encoding encoding, string mimeType, bool willSeek, Microsoft.ReportingServices.Interfaces.StreamOper operation)
{
_name = name;
_encoding = encoding;
_extension = extension;
_mimeType = mimeType;
_operation = operation;
_willSeek = willSeek;
intermediateStream = new MemoryStream();
return intermediateStream;
}
public bool Render(Report report,
System.Collections.Specialized.NameValueCollection reportServerParameters,
System.Collections.Specialized.NameValueCollection deviceInfo,
System.Collections.Specialized.NameValueCollection clientCapabilities,
ref System.Collections.Hashtable renderProperties,
Microsoft.ReportingServices.Interfaces.CreateAndRegisterStream createAndRegisterStream)
{
//Call the render method of the intermediate rendering extension
pdfRenderer.Render(report, reportServerParameters, deviceInfo, clientCapabilities, ref renderProperties, new Microsoft.ReportingServices.Interfaces.CreateAndRegisterStream(IntermediateCreateAndRegisterStream));
//Register stream for new rendering extension
Stream outputStream = createAndRegisterStream(_name, _extension, _encoding, _mimeType, _willSeek, _operation);
intermediateStream.Position = 0;
//put stream update code here
//Copy the stream to the outout stream
byte[] buffer = new byte[32768];
while (true) {
int read = intermediateStream.Read(buffer, 0, buffer.Length);
if (read <= 0) break;
outputStream.Write(buffer, 0, read);
}
intermediateStream.Close();
return false;
}
public bool RenderStream(string streamName, Report report, System.Collections.Specialized.NameValueCollection reportServerParameters, System.Collections.Specialized.NameValueCollection deviceInfo, System.Collections.Specialized.NameValueCollection clientCapabilities, ref System.Collections.Hashtable renderProperties, Microsoft.ReportingServices.Interfaces.CreateAndRegisterStream createAndRegisterStream)
{
return false;
}
public string LocalizedName
{
get { return "PDF Renderer with background"; }
}
public void SetConfiguration(string configuration)
{
pdfRenderer.SetConfiguration(configuration);
}
}
}