鉴于您一直遇到这个问题,我将给您一个较长的答案,希望能帮助您。
首先,我没有访问ASP.Net服务器,因此我正在从桌面上的文件夹运行所有内容。因此,您将看到我从Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
开始读写,而不是相对路径。我假设您稍后可以更换您自己的路径。
其次,(虽然并不重要),我没有SSRS,所以我创建了一个“帮助器”方法,为我生成虚拟PDF并将其作为字节数组返回:
private Byte[] getSSRSPdfAsByteArray() {
using (var ms = new System.IO.MemoryStream()) {
using (var doc = new Document()) {
using (var writer = PdfWriter.GetInstance(doc, ms)) {
doc.Open();
doc.Add(new Paragraph("This is my SSRS report"));
doc.Close();
}
}
return ms.ToArray();
}
}
第三,为了让我们达成共识并有些东西可操作,我创建了两个额外的辅助方法来生成一些样本图片和PDF文件:
private void createSampleImages(int count, string workingFolder) {
var random = new Random();
for (var i = 0; i < count; i++) {
using (var bmp = new System.Drawing.Bitmap(200, 200)) {
using (var g = System.Drawing.Graphics.FromImage(bmp)) {
g.Clear(Color.FromArgb(random.Next(0, 255), random.Next(0, 255), random.Next(0, 255)));
}
bmp.Save(System.IO.Path.Combine(workingFolder, string.Format("Image_{0}.jpg", i)));
}
}
}
private void createSamplePDFs(int count, string workingFolder) {
var random = new Random();
for (var i = 0; i < count; i++) {
using (var ms = new System.IO.MemoryStream()) {
using (var doc = new Document()) {
using (var writer = PdfWriter.GetInstance(doc, ms)) {
doc.Open();
var pageCount = random.Next(1, 10);
for (var j = 0; j < pageCount; j++) {
doc.NewPage();
doc.Add(new Paragraph(String.Format("This is page {0} of document {1}", j, i)));
}
doc.Close();
}
}
System.IO.File.WriteAllBytes(System.IO.Path.Combine(workingFolder, string.Format("File_{0}.pdf", i)), ms.ToArray());
}
}
}
再次强调,显然您不需要这三个辅助方法,它们只是为了让您和我有一个共同的文件集。这些辅助方法也故意没有注释。
第四,下面的代码末尾,我将最终的PDF存储在一个名为finalFileBytes
的字节数组中,然后将其写入磁盘。再次说明,我正在桌面上工作,所以这里您需要使用Response.BinaryWrite(finalFileBytes)
。
第五,有不同的方法来合并和组合文件。PdfCopy
、PdfSmartCopy
和PdfStamper
都是常用的方法。我鼓励您阅读官方iText/iTextSharp书籍,或者至少阅读免费的第6章,与现有PDF一起工作,该章节详细介绍了这一点。在下面的代码中,我使用PdfSmartCopy
,并将每个图像转换为PDF再导入。可能有更好的方法,但我不确定是否可以一次性完成。Bruno比我更清楚。但下面的代码可行。
有关正在进行的详细信息,请参见各个代码注释。
var workingFolder = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Pdf Test");
var finalPDF = System.IO.Path.Combine(workingFolder, "test.pdf");
System.IO.Directory.CreateDirectory(workingFolder);
createSampleImages(10, workingFolder);
createSamplePDFs(10, workingFolder);
var SSRS_Bytes = getSSRSPdfAsByteArray();
Byte[] finalFileBytes;
using (var finalFile = new System.IO.MemoryStream()) {
using (var doc = new Document()) {
using (var copy = new PdfSmartCopy(doc, finalFile)) {
doc.Open();
using (var reader = new PdfReader(SSRS_Bytes)) {
for (var i = 1; i <= reader.NumberOfPages; i++) {
copy.AddPage(copy.GetImportedPage(reader, i));
}
}
foreach (var f in System.IO.Directory.EnumerateFiles(workingFolder, "*.jpg", SearchOption.TopDirectoryOnly)) {
iTextSharp.text.Rectangle pageSize = null;
using (var srcImage = new Bitmap(f)) {
pageSize = new iTextSharp.text.Rectangle(0, 0, srcImage.Width, srcImage.Height);
}
Byte[] imageBytes;
using (var m = new MemoryStream()) {
using (var d = new Document(pageSize, 0, 0, 0, 0)) {
using (var w = PdfWriter.GetInstance(d, m)) {
d.Open();
d.Add(iTextSharp.text.Image.GetInstance(f));
d.Close();
}
}
imageBytes = m.ToArray();
}
using (var reader = new PdfReader(imageBytes)) {
for (var i = 1; i <= reader.NumberOfPages; i++) {
copy.AddPage(copy.GetImportedPage(reader, i));
}
}
}
foreach (var f in System.IO.Directory.EnumerateFiles(workingFolder, "*.pdf", SearchOption.TopDirectoryOnly)) {
if (f == finalPDF) {
continue;
}
using (var reader = new PdfReader(f)) {
for (var i = 1; i <= reader.NumberOfPages; i++) {
copy.AddPage(copy.GetImportedPage(reader, i));
}
}
}
doc.Close();
}
}
finalFileBytes = finalFile.ToArray();
}
System.IO.File.WriteAllBytes(finalPDF, finalFileBytes);