合并memorystream到一个itext文档 [英] Merge memorystreams to one itext document
问题描述
我有四个MemoryStreams的数据,我想合并,然后打开pdfDocument,而不创建一个单一的文件。
I have four MemoryStreams of data that I want to merge and then open the pdfDocument, without creating a single file.
可以将它们写入文件,然后合并它们,但这将是不好的行为,这也可能会导致一些问题,所以我想避免这样做。
It's possible to write them down to files and then merge them but that would be bad praxis and that can also cause a few issues so I want to avoid that.
但是,我找不到合并MemoryStreams与iText的方法。
However, I can not find a way to merge the MemoryStreams with iText.
现在,这是我如何使用文件:
Right now, this is how I do it with files:
private static void ConcatenateDocuments()
{
var stream = new MemoryStream();
var readerFrontPage = new PdfReader(Folder + FrontPageName);
var readerDocA = new PdfReader(Folder + docA);
var readerDocB = new PdfReader(Folder + DocB);
var readerAppendix = new PdfReader(Folder + Appendix);
var pdfCopyFields = new PdfCopyFields(stream);
pdfCopyFields.AddDocument(readerFrontPage);
pdfCopyFields.AddDocument(readerDocA );
pdfCopyFields.AddDocument(readerDocB);
pdfCopyFields.AddDocument(readerAppendix);
pdfCopyFields.Close();
SavePdf(stream, FilenameReport);
}
因为我需要删除文件的使用,我保持MemoryStream的不同的部分由不同的资源构建。所以我提到这些记忆库。
Since I need to remove the use of files, I keep the MemoryStream's as the different parts are built from different resources. So I have references to these memorystreams.
如何做到这一点?
推荐答案
错误 PDF标头未找到
通过将流的位置
重新设置为 0
,可以设置为true。因为你没有得到错误无法访问一个封闭的流
我假设你已经正确设置 PdfWriter
CloseStream
到 false
。
The error PDF header signature not found
can be fixed in this case by setting the stream's Position
back to 0
. Since you're not getting the error Cannot access a closed Stream
I'm assuming that you are already correctly setting the PdfWriter
's CloseStream
to false
.
一个完整的工作C#2010 WinForm应用程序针对iTextSharp 5.1.1.0,在 MemoryStreams
中创建三个PDF并组合它们。因为我没有Web服务器,所以我将它们写入磁盘。
Below is a full working C# 2010 WinForm app targeting iTextSharp 5.1.1.0 that creates three PDFs in MemoryStreams
and combines them. Since I don't have a web server handy I'm writing them to disk.
using System;
using System.Text;
using System.Windows.Forms;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
//Create three MemoryStreams
MemoryStream[] streams = { CreateDoc("Page 1"), CreateDoc("Page 2"), CreateDoc("Page 3") };
//I don't have a web server handy so I'm going to write my final MemoryStream to a byte array and then to disk
byte[] bytes;
//Create our final combined MemoryStream
using (MemoryStream finalStream = new MemoryStream())
{
//Create our copy object
PdfCopyFields copy = new PdfCopyFields(finalStream);
//Loop through each MemoryStream
foreach (MemoryStream ms in streams)
{
//Reset the position back to zero
ms.Position = 0;
//Add it to the copy object
copy.AddDocument(new PdfReader(ms));
//Clean up
ms.Dispose();
}
//Close the copy object
copy.Close();
//Get the raw bytes to save to disk
bytes = finalStream.ToArray();
}
//Write out the file to the desktop
string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Combined.pdf");
using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None))
{
fs.Write(bytes, 0, bytes.Length);
}
this.Close();
}
/// <summary>
/// Helper method to create temporary documents
/// </summary>
private MemoryStream CreateDoc(string name)
{
MemoryStream ms = new MemoryStream();
using (Document doc = new Document(PageSize.LETTER))
{
using (PdfWriter writer = PdfWriter.GetInstance(doc, ms))
{
writer.CloseStream = false;
doc.Open();
doc.Add(new Paragraph(name));
doc.Close();
}
}
return ms;
}
}
}
这篇关于合并memorystream到一个itext文档的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!