Я пытаюсь объединить 2 кристаллических отчета в один файл PDF и использую Itextsharp v5.1.1. Но он говорит, что документ не может быть открыт. Это может быть повреждено. Там нет ошибок сборки. но PDF-файл искажен и не может быть открыт. Вот заказ, который я выбрал, чтобы выполнить это.
- Экспорт отчета Crystal в MemoryStream1 в формате PDF
- Экспорт второго отчета в MemoryStream2.
- Объединение потоков памяти
- Отправка потока в ответ Http в формате PDF.
Вот код для каждого шага в заказе.
/// Get the Dataset from Stored Procedure for the CSSource Report
dsCS = CSData.GetUSSourceXML(ds_input);
/// Create the Report of type CSsource
rptCS = ReportFactory.GetReport(typeof(CSsource));
rptCS .SetDataSource(dsCS);
/// Set the Parameters to the CS report
rptCS .ParameterFields["Parameterid"].CurrentValues.Clear();
rptCS .SetParameterValue("Parameterid", PID);
//// Serialize the Object as PDF
msCS=(MemoryStream)rptCS .ExportToStream(ExportFormatType.PortableDocFormat);
для шага 2
/// Get the Dataset from Stored Procedure for the Aden Report
dsAd = CSData.GetAdden(ds_input);
/// Create the Report of type Aden
rptAd = ReportFactory.GetReport(typeof(Aden));
rptAd.SetDataSource(dsAd );
/// Set the Parameters to the Aden report
rptAd.ParameterFields["Parameterid"].CurrentValues.Clear();
rptAd.SetParameterValue("Parameterid", PID);
//// Serialize the Object as PDF
msAD = (MemoryStream)rptAd.ExportToStream(ExportFormatType.PortableDocFormat);
для шага 3
System.Collections.Generic.List<byte[]> sourceFiles = new List<byte[]>();
sourceFiles.Add(msCS.ToArray());
sourceFiles.Add(msAD.ToArray());
PdfMerger mpdfs = new PdfMerger();
/// ms is the Memory stream to which both the streams are added
ms=mpdfs.MergeFiles(sourceFiles);
Метод MergeFiles выглядит следующим образом
public MemoryStream MergeFiles(Generic.List<byte[]> sourceFiles)
{
Document document = new Document();
MemoryStream output = new MemoryStream();
try
{
// Initialize pdf writer
PdfWriter writer = PdfWriter.GetInstance(document, output);
//writer.PageEvent = new PdfPageEvents();
// Open document to write
document.Open();
PdfContentByte content = writer.DirectContent;
// Iterate through all pdf documents
for (int fileCounter = 0; fileCounter < sourceFiles.Count;
fileCounter++)
{
// Create pdf reader
PdfReader reader = new PdfReader(sourceFiles[fileCounter]);
int numberOfPages = reader.NumberOfPages;
// Iterate through all pages
for (int currentPageIndex = 1; currentPageIndex <=
numberOfPages; currentPageIndex++)
{
// Determine page size for the current page
document.SetPageSize(
reader.GetPageSizeWithRotation(currentPageIndex));
// Create page
document.NewPage();
PdfImportedPage importedPage =
writer.GetImportedPage(reader, currentPageIndex);
// Determine page orientation
int pageOrientation =
reader.GetPageRotation(currentPageIndex);
if ((pageOrientation == 90) || (pageOrientation == 270))
{
content.AddTemplate(importedPage, 0, -1f, 1f, 0, 0,
reader.GetPageSizeWithRotation(currentPageIndex).Height);
}
else
{
content.AddTemplate(importedPage, 1f, 0, 0, 1f, 0, 0);
}
}
}
}
catch (Exception exception)
{
throw new Exception("There has an unexpected exception" +
" occured during the pdf merging process.", exception);
}
finally
{
// document.Close();
}
return output;
}
Шаг 4 для сериализации потока памяти в формате PDF
// ms is the memory stream which is to be converted to PDF
Response.Clear();
Response.ClearContent();
Response.ClearHeaders();
Response.ContentType = "application/pdf";
Response.Charset = string.Empty;
Response.AddHeader("Content-Disposition",
"attachment; filename=" +
"Application of " + FullName.Trim() + ".pdf");
//Write the file directly to the HTTP content output stream.
Response.OutputStream.Write(ms.ToArray(), 0,
Convert.ToInt32(ms.Length));
Response.OutputStream.Flush();
Response.OutputStream.Close();
rptCS.Close();
rptCS.Dispose();
rptAd.Close();
rptAd.Dispose();
Спасибо всем разработчикам, которые помогают мне с этим.
Это срочно, потому что он должен идти в производство через день или 2.
Пожалуйста, ответьте.
Chandanan.