基本的に、ユーザーは1つのリンクをクリックして、複数のpdfファイルをダウンロードできる必要があります。しかし、キャッチは、サーバー上またはどこにもファイルを作成できないことです。すべてがメモリ内にある必要があります。
メモリストリームとResponse.Flush()をpdfとして作成できましたが、ファイルを作成せずに複数のメモリストリームを圧縮するにはどうすればよいですか。
これが私のコードです:
Response.ContentType = "application/Zip";
// If the browser is receiving a mangled zipfile, IIS Compression may cause this problem. Some members have found that
// Response.ContentType = "application/octet-stream" has solved this. May be specific to Internet Explorer.
Response.AppendHeader("content-disposition", "attachment; filename=\"Download.Zip\"");
Response.CacheControl = "Private";
Response.Cache.SetExpires(DateTime.Now.AddMinutes(3)); // or put a timestamp in the filename in the content-disposition
byte[] abyBuffer = new byte[4096];
ZipOutputStream outStream = new ZipOutputStream(Response.OutputStream);
outStream.SetLevel(3);
#region Repeat for each Memory Stream
MemoryStream fStream = CreateClassroomRoster();// This returns a memory stream with pdf document
ZipEntry objZipEntry = new ZipEntry(ZipEntry.CleanName("ClassroomRoster.pdf"));
objZipEntry.DateTime = DateTime.Now;
objZipEntry.Size = fStream.Length;
outStream.PutNextEntry(objZipEntry);
int count = fStream.Read(abyBuffer, 0, abyBuffer.Length);
while (count > 0)
{
outStream.Write(abyBuffer, 0, count);
count = fStream.Read(abyBuffer, 0, abyBuffer.Length);
if (!Response.IsClientConnected)
{
break;
}
Response.Flush();
}
fStream.Close();
#endregion
outStream.Finish();
outStream.Close();
Response.Flush();
Response.End();
これによりZipファイルが作成されますが、その中にファイルはありません
私はiTextSharp.textを使用しています-ICSharpCode.SharpZipLib.Zipを使用してPDFを作成するために-圧縮のために
ありがとう、カビタ
このリンクでは、SharpZipLibを使用してMemoryStreamからZipを作成する方法について説明します: https://github.com/icsharpcode/SharpZipLib/wiki/Zip-Samples#wiki-anchorMemory 。これとiTextSharpを使用して、メモリ内に作成された複数のPDFファイルを圧縮することができました。
これが私のコードです:
MemoryStream outputMemStream = new MemoryStream();
ZipOutputStream zipStream = new ZipOutputStream(outputMemStream);
zipStream.SetLevel(3); //0-9, 9 being the highest level of compression
byte[] bytes = null;
// loops through the PDFs I need to create
foreach (var record in records)
{
var newEntry = new ZipEntry("test" + i + ".pdf");
newEntry.DateTime = DateTime.Now;
zipStream.PutNextEntry(newEntry);
bytes = CreatePDF(++i);
MemoryStream inStream = new MemoryStream(bytes);
StreamUtils.Copy(inStream, zipStream, new byte[4096]);
inStream.Close();
zipStream.CloseEntry();
}
zipStream.IsStreamOwner = false; // False stops the Close also Closing the underlying stream.
zipStream.Close(); // Must finish the ZipOutputStream before using outputMemStream.
outputMemStream.Position = 0;
return File(outputMemStream.ToArray(), "application/octet-stream", "reports.Zip");
CreatePDFメソッド:
private static byte[] CreatePDF(int i)
{
byte[] bytes = null;
using (MemoryStream ms = new MemoryStream())
{
Document document = new Document(PageSize.A4, 25, 25, 30, 30);
PdfWriter writer = PdfWriter.GetInstance(document, ms);
document.Open();
document.Add(new Paragraph("Hello World " + i));
document.Close();
writer.Close();
bytes = ms.ToArray();
}
return bytes;
}
このコードは、ダウンロードリンクから各ファイルを取得する複数のPDFファイルでZipを作成するのに役立ちます。
using (var outStream = new MemoryStream())
{
using (var archive = new ZipArchive(outStream, ZipArchiveMode.Create, true))
{
for (String Url in UrlList)
{
WebRequest req = WebRequest.Create(Url);
req.Method = "GET";
var fileInArchive = archive.CreateEntry("FileName"+i+ ".pdf", CompressionLevel.Optimal);
using (var entryStream = fileInArchive.Open())
using (WebResponse response = req.GetResponse())
{
using (var fileToCompressStream = response.GetResponseStream())
{
entryStream.Flush();
fileToCompressStream.CopyTo(entryStream);
fileToCompressStream.Flush();
}
}
i++;
}
}
using (var fileStream = new FileStream(@"D:\test.Zip", FileMode.Create))
{
outStream.Seek(0, SeekOrigin.Begin);
outStream.CopyTo(fileStream);
}
}
必要な名前空間:System.IO.Compression; System.IO.Compression.ZipArchive;
PDFファイルを生成してIsolatedStorageFileStreamに保存し、そのストレージからコンテンツを圧縮することができます。
以下は、ICSharpCode.SharpZipLibdll内に存在するZipOutputStreamクラスを使用してMemoryStreamにZipファイルを作成しているコードです。
FileStream fileStream = File.OpenRead(@"G:\1.pdf");
MemoryStream MS = new MemoryStream();
byte[] buffer = new byte[fileStream.Length];
int byteRead = 0;
ZipOutputStream zipOutputStream = new ZipOutputStream(MS);
zipOutputStream.SetLevel(9); //Set the compression level(0-9)
ZipEntry entry = new ZipEntry(@"1.pdf");//Create a file that is needs to be compressed
zipOutputStream.PutNextEntry(entry);//put the entry in Zip
//Writes the data into file in memory stream for compression
while ((byteRead = fileStream.Read(buffer, 0, buffer.Length)) > 0)
zipOutputStream.Write(buffer, 0, byteRead);
zipOutputStream.IsStreamOwner = false;
fileStream.Close();
zipOutputStream.Close();
MS.Position = 0;