我在网上搜索了如何做到这一点的例子.我发现了一些似乎需要更多参与的东西.所以我的问题是,使用iTextSharp,是否有一种相当简洁的方法将一个PDF文档附加到另一个?
最理想的是,这不会涉及第三个文件.只需打开第一个PDF文档,将第二个PDF文档附加到第一个,然后关闭它们.
Lou*_*ier 13
我真的可能会遗漏一些东西,但我做了一些更简单的事情.我承认这个解决方案可能不会更新书签(就像到目前为止最好的答案),但它对我来说完美无缺.由于我将文档与可填写的表单合并,我使用PdfCopyFields而不是PdfCopy.
这是代码(我已经删除了所有错误处理以使实际代码更加可见,如果您打算使用代码,请添加一个try..finally来关闭打开的资源):
void MergePdfStreams(List<Stream> Source, Stream Dest)
{
PdfCopyFields copy = new PdfCopyFields(Dest);
foreach (Stream source in Source)
{
PdfReader reader = new PdfReader(source);
copy.AddDocument(reader);
}
copy.Close();
}
Run Code Online (Sandbox Code Playgroud)
您可以传递任何流,无论是FileStream,MemoryStream(从数据库读取PDF时都很有用,不需要临时文件等)
样品用法:
void TestMergePdfStreams()
{
List<Stream> sources = new List<Stream>()
{
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));
}
Run Code Online (Sandbox Code Playgroud)
好吧,这不是直截了当的,但它起作用并且速度惊人.(它使用第三个文件,没有打开和附加的东西.)我在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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
16288 次 |
| 最近记录: |