首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果存在iTextSharp附加页,则使用邮票

如果存在iTextSharp附加页,则使用邮票
EN

Stack Overflow用户
提问于 2017-04-24 18:14:10
回答 1查看 759关注 0票数 0

我使用以下方法获取2个pdf (CADPDF & TemplatePDF ),并将它们叠加为另一个pdf (FinalPDF)。

代码语言:javascript
复制
public void MergePDFs(string CADPDF, string TemplatePDF, string FinalPDF, string oldData, string newData, string jobNumber, string customer, string designer, string date)
    {
        PdfReader reader = new PdfReader(TemplatePDF);
        PdfReader reader2 = new PdfReader(CADPDF);

        PdfStamper stamper = new PdfStamper(reader, new FileStream(FinalPDF, FileMode.Append, FileAccess.Write));

        PSModel psModel = powerSHAPE.ActiveModel;

        try
        {

            AcroFields fields = stamper.AcroFields;

            fields.SetField("oldDataField", oldData);
            fields.SetField("newDataField", newData);
            fields.SetField("jobNumberField", jobNumber);
            fields.SetField("customerField", customer);
            fields.SetField("dateField", date);
            fields.SetField("designerField", designer);
            stamper.FormFlattening = false;

            PdfImportedPage page = stamper.GetImportedPage(reader2, 1);
            PdfContentByte cb;

            cb = stamper.GetOverContent(1);
            cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(1).Height);

            stamper.Close();
        }
        catch
        {
            System.Windows.MessageBox.Show("Unable to merge drawing with template!");
        }

        stamper.Close();



    }

一切都运行得很好,但是现在如果这个FinalPDF已经存在,我需要追加另一个页面。我已经将FileStream的FileMode更改为附加,但是FinalPDF是覆盖的,而不是附加的。

如有任何指示,将不胜感激。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-24 19:24:47

通过使用内存流和iTextSharp数组,我在使用byte[]时取得了最好的效果。我使用PdfSmartCopy类生成一个空白PDF,然后从不同的源中以byte[]的形式检索所需的元素。

使用以下方法使用byte[]返回数据的PdfStamper

代码语言:javascript
复制
        public byte[] GetContentToMerge(string CADPDF, string TemplatePDF, string oldData, string newData, string jobNumber, string customer, string designer, string date)
    {

        using (MemoryStream ms = new MemoryStream())
        {

            PdfReader reader = new PdfReader(TemplatePDF);
            PdfReader reader2 = new PdfReader(CADPDF);

            // Use a Memory stream instead of a filestream 
            PdfStamper stamper = new PdfStamper(reader, ms);

            //PSModel psModel = powerSHAPE.ActiveModel;

            try
            {

                AcroFields fields = stamper.AcroFields;

                fields.SetField("oldDataField", oldData);
                fields.SetField("newDataField", newData);
                fields.SetField("jobNumberField", jobNumber);
                fields.SetField("customerField", customer);
                fields.SetField("dateField", date);
                fields.SetField("designerField", designer);
                stamper.FormFlattening = false;

                PdfImportedPage page = stamper.GetImportedPage(reader2, 1);
                PdfContentByte cb;

                cb = stamper.GetOverContent(1);
                cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(1).Height);

                stamper.Close();
                reader.Close();
                reader2.Close();

                // The content you wanted to create is in a memory stream. 
                // It can bee appended to a PDF as a byte[] 
                byte[] ContentToAppend = ms.ToArray();
                return ContentToAppend;

            }
            catch
            {
                System.Windows.MessageBox.Show("Unable to merge drawing with template!");                    
            }

            stamper.Close();
        }

        // If we made it here, something went wrong.
        return new byte[0];
    }

使用该方法,您可以从父方法调用它并以编程方式执行追加操作。

代码语言:javascript
复制
        public void MergePDFs(string CADPDF, string TemplatePDF, string FinalPDF, string oldData, string newData, string jobNumber, string customer, string designer, string date)
    {
            using (Document oDoc = new Document())
            using (MemoryStream ms = new MemoryStream())
            {

                PdfSmartCopy oPDF = new PdfSmartCopy(oDoc, ms);
                oDoc.Open();

                // If the FinalPDF file already exists, load it's data into the PDF 1st.
                if (File.Exists(FinalPDF))
                {
                    byte[] bytesFinalPDF = File.ReadAllBytes(FinalPDF);
                    oPDF.AddDocument(new PdfReader(bytesFinalPDF));
                }
                // If it doesn't exist, the oPDF is blank at this point.

                // Second  add the CAD and Template data to the PDF
                // We do this by calling the GetContentToMerge method which returns the byte array of data that was created using the stamper.
                byte[] ContentToAdd = GetContentToMerge(CADPDF, TemplatePDF, oldData, newData, jobNumber, customer, designer, date);
                if (ContentToAdd.Length > 0)
                {
                    oPDF.AddDocument(new PdfReader(ContentToAdd));
                }

                oDoc.Close();

                // Take whatever went into oPDF object's memory stream and write it to a file with path FinalPDF
                File.WriteAllBytes(FinalPDF, ms.ToArray());
            }
    }

**我没有调试这个100%,所以它可能需要一些清理检查是否存在文件,读/写权限等.

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43595055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档