我在网上搜索了如何做到这一点的例子.我发现了一些似乎需要更多参与的东西.所以我的问题是,使用iTextSharp,是否有一种相当简洁的方法将一个PDF文档附加到另一个?
最理想的是,这不会涉及第三个文件.只需打开第一个PDF文档,将第二个PDF文档附加到第一个,然后关闭它们.
我真的可能会遗漏一些东西,但我做了一些更简单的事情.我承认这个解决方案可能不会更新书签(就像到目前为止最好的答案),但它对我来说完美无缺.由于我将文档与可填写的表单合并,我使用PdfCopyFields而不是PdfCopy.
这是代码(我已经删除了所有错误处理以使实际代码更加可见,如果您打算使用代码,请添加一个try..finally来关闭打开的资源):
void MergePdfStreams(ListSource, Stream Dest) { PdfCopyFields copy = new PdfCopyFields(Dest); foreach (Stream source in Source) { PdfReader reader = new PdfReader(source); copy.AddDocument(reader); } copy.Close(); }
您可以传递任何流,无论是FileStream,MemoryStream(从数据库读取PDF时都很有用,不需要临时文件等)
样品用法:
void TestMergePdfStreams() { Listsources = new List () { new FileStream("template1.pdf", FileMode.Open), new FileStream("template2.pdf", FileMode.Open), new MemoryStream((byte[])someDataRow["PDF_COLUMN_NAME"]) }; MergePdfStreams(sources, new FileStream("MergedOutput.pdf", FileMode.Create)); }
好吧,这不是直截了当的,但它起作用并且速度惊人.(它使用第三个文件,没有打开和附加的东西.)我在docs/examples中发现了这个.这是代码:
private void CombineMultiplePDFs( string[] fileNames, string outFile ) { int pageOffset = 0; ArrayList master = new ArrayList(); int f = 0; Document document = null; PdfCopy writer = null; while ( f < fileNames.Length ) { // we create a reader for a certain document PdfReader reader = new PdfReader( fileNames[ f ] ); reader.ConsolidateNamedDestinations(); // we retrieve the total number of pages int n = reader.NumberOfPages; ArrayList bookmarks = SimpleBookmark.GetBookmark( reader ); if ( bookmarks != null ) { if ( pageOffset != 0 ) { SimpleBookmark.ShiftPageNumbers( bookmarks, pageOffset, null ); } master.AddRange( bookmarks ); } pageOffset += n; if ( f == 0 ) { // step 1: creation of a document-object document = new Document( reader.GetPageSizeWithRotation( 1 ) ); // step 2: we create a writer that listens to the document writer = new PdfCopy( document, new FileStream( outFile, FileMode.Create ) ); // step 3: we open the document document.Open(); } // step 4: we add content for ( int i = 0; i < n; ) { ++i; if ( writer != null ) { PdfImportedPage page = writer.GetImportedPage( reader, i ); writer.AddPage( page ); } } PRAcroForm form = reader.AcroForm; if ( form != null && writer != null ) { writer.CopyAcroForm( reader ); } f++; } if ( master.Count > 0 && writer != null ) { writer.Outlines = master; } // step 5: we close the document if ( document != null ) { document.Close(); } }