Pdf iTextSharp合并并保留插件

Pdf iTextSharp合并并保留插件,pdf,merge,itextsharp,Pdf,Merge,Itextsharp,我有一个PDF,在一个页面上有一个插件控件。我需要将它与另一个pdf合并,但当我合并时,插件被重新定义为一个空白矩形。有没有办法合并并保留插件控件?如果重要,该插件是通过Composer Player控件安装的Desault Systemes 3D 我使用的代码是simple writer getinstance、contentbyte directcontent、getimportedpage和addtemplate。没什么特别的 FileStream docStream = new File

我有一个PDF,在一个页面上有一个插件控件。我需要将它与另一个pdf合并,但当我合并时,插件被重新定义为一个空白矩形。有没有办法合并并保留插件控件?如果重要,该插件是通过Composer Player控件安装的Desault Systemes 3D

我使用的代码是simple writer getinstance、contentbyte directcontent、getimportedpage和addtemplate。没什么特别的

FileStream docStream = new FileStream(@"C:\Temp\Merged.pdf", FileMode.Create);
            Document newDocument = new Document(PageSize.A4.Rotate());
            PdfWriter pdfWriter = PdfWriter.GetInstance(newDocument, docStream);
        try
        {
            newDocument.Open();
            PdfContentByte pdfContentByte = pdfWriter.DirectContent;

            newDocument.NewPage();
            PdfReader mainPage = new PdfReader(@"C:\Temp\PageWithPlugin.pdf");
            PdfImportedPage importedPage1 = pdfWriter.GetImportedPage(mainPage, 1);
            pdfContentByte.AddTemplate(importedPage1, 0, 0);
            mainPage.Close();

            PdfReader smgPages = new PdfReader(@"C:\Temp\MorePages.pdf");
            for (int page = 1; page <= smgPage.NumberOfPages; page++)
            {
                newDocument.NewPage();
                PdfImportedPage importedPage = pdfWriter.GetImportedPage(smgPages, page);
                pdfContentByte.AddTemplate(importedPage, 0, 0);
            }
            smgPages.Close();

            }
        finally
        {
            docStream.Flush();
            if (newDocument != null)
                newDocument.Close();
            docStream.Close();
        }
FileStream docStream=newfilestream(@“C:\Temp\Merged.pdf”,FileMode.Create);
Document newDocument=新文档(PageSize.A4.Rotate());
PdfWriter PdfWriter=PdfWriter.GetInstance(newDocument,docStream);
尝试
{
newDocument.Open();
PdfContentByte PdfContentByte=pdfWriter.DirectContent;
newDocument.NewPage();
PdfReader主页=新的PdfReader(@“C:\Temp\PageWithPlugin.pdf”);
PdfImportedPage importedPage1=pdfWriter.GetImportedPage(主页面,1);
pdfContentByte.AddTemplate(导入的页面1,0,0);
mainPage.Close();
PdfReader smgPages=新PdfReader(@“C:\Temp\MorePages.pdf”);
对于(int page=1;page请尝试一下

List<byte[]> fileList = new List<byte[]>();

using (FileStream fileSteam = File.OpenRead((@"C:\Temp\PageWithPlugin.pdf")))
{
     Byte[] byteArray = new byte[fileSteam.Length];
     fileSteam.Read(byteArray, 0, byteArray.Length);

     fileList.Add(byteArray);
}

using (FileStream fileSteam = File.OpenRead((@"C:\Temp\MorePages.pdf")))
{
     Byte[] byteArray = new byte[fileSteam.Length];
     fileSteam.Read(byteArray, 0, byteArray.Length);

     fileList.Add(byteArray);
}

using(MemoryStream msOutput = new MemoryStream())
{
     PdfReader pdfFile = new PdfReader(fileList[0]);
     Document doc = new Document();
     PdfWriter pCopy = new PdfSmartCopy(doc, msOutput);

     doc.Open();

     for (int k = 0; k < fileList.Count; k++)
     {
         for (int i = 1; i < pdfFile.NumberOfPages + 1; i++)
         {
             pdfFile = new PdfReader(fileList[k]);
             ((PdfSmartCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i));
             pCopy.FreeReader(pdfFile);
         }
     }

     pdfFile.Close();
     pCopy.Close();
     doc.Close();
     fileList.Clear();

     byte[] form = msOutput.ToArray();

     using (FileStream fileSteam = new FileStream(@"C:\Temp\Merged.pdf", FileMode.Create))
     {
          fileStream.Write(form, 0, form.Length);
     }
}
List fileList=newlist();
使用(FileStream fileSteam=File.OpenRead(@“C:\Temp\PageWithPlugin.pdf”))
{
Byte[]byteArray=新字节[fileSteam.Length];
读取(byteArray,0,byteArray.Length);
fileList.Add(byteArray);
}
使用(FileStream fileSteam=File.OpenRead(@“C:\Temp\MorePages.pdf”))
{
Byte[]byteArray=新字节[fileSteam.Length];
读取(byteArray,0,byteArray.Length);
fileList.Add(byteArray);
}
使用(MemoryStream msOutput=new MemoryStream())
{
PdfReader pdfFile=新的PdfReader(文件列表[0]);
单据单据=新单据();
PdfWriter pCopy=新的PdfSmartCopy(文档、msOutput);
doc.Open();
for(int k=0;k
不要看礼物马的嘴,但是…如果其他人使用该解决方案,k循环存在一个小问题。第0个1页之后,页数将减少一个文档,pdfReader会不断释放并重新阅读每一页,这是不必要的。我认为这是对该部分代码的改进:

using (MemoryStream msOutput = new MemoryStream())
            {
                Document doc = new Document();
                PdfWriter pCopy = new PdfCopy(doc, msOutput);
                doc.Open();
                for (int k = 0; k < fileList.Count; k++)
                {
                    PdfReader pdfFile = new PdfReader(fileList[k]);                        
                    for (int i = 1; i < pdfFile.NumberOfPages + 1; i++)
                    {
                        ((PdfCopy)pCopy).AddPage(pCopy.GetImportedPage(pdfFile, i));
                    }
                    pCopy.FreeReader(pdfFile);
                    pdfFile.Close();
                }
                pCopy.Close();
                doc.Close();
                fileList.Clear();
使用(MemoryStream msOutput=new MemoryStream())
{
单据单据=新单据();
PdfWriter pCopy=新的PdfCopy(文档,msOutput);
doc.Open();
for(int k=0;k
PdfCopy
PdfSmartCopy
都可以工作。
PdfSmartCopy
比较导入到PDF中的所有流,以确保没有重复。开销,但在某些情况下会导致更小的PDF。这非常有效。非常感谢及时的响应。不要在mou中看礼物马但是…如果其他人使用该解决方案,k循环会有一个小问题。第0页之后,页面数会减少一个文档,pdfReader会不断释放并重新读取每个页面,这是不必要的。我认为这是对代码部分的改进:另一个问题…MorePages.pdf有pters.单独打开时,可以查看TOC,但Merged.pdf中没有TOC。合并时有没有办法保留章节/TOC?@JeffLit这是一个好问题,我不熟悉iTextSharp中如何处理章节。就您在k循环中看到的错误而言,我没有遇到任何问题。k循环在文件中迭代列表是一个基于0的数组,当它到达最后一个文档时,循环继续,再次迭代k,然后等于列表计数,循环终止。不过,我将尝试将PdfReader和FeeReader移出循环。谢谢,祝你好运。