Is Document doc.Add(pdf) possible?

ぐ巨炮叔叔 提交于 2020-01-07 02:06:10

问题


I am trying to add pdf to another pdf. Document doc.Add(IElement) is what I know to do and I am having trouble adding the pdf. I tried adding image and that worked. How do I add a pdf file to my document?

iTextSharp.text.Image img;
foreach (var buf in List) {
   myDoc.NewPage();
   img = iTextSharp.text.Image.GetInstance(buf);
   img.ScaleToFit(612f, 792f);
   img.Alignment = iTextSharp.text.Image.ALIGN_CENTER | iTextSharp.text.Image.ALIGN_MIDDLE;
   myDoc.Add(img);
}

回答1:


You can't use Document.Add() but it's still pretty easy. First you need to create a PdfReader object to read your source document. Then use the PdfWriter of your destination document and call its GetImportedPage(reader, pageNumber) method on each page that you want to import. This will give you a PdfImportedPage object that you can pass to PdfWriter.DirectContent.AddTemplate().

Below is a full working C# 2010 WinForms app targeting iTextSharp 5.1.1.0 that shows off all of these steps. First it creates a sample file (File1) and then creates a second file (File2) and adds the first file to it. It does some extra things, too, to show off some edge cases, specifically how to handle rotated pages. See the code comments for specific details.

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)
        {
            //The names of the two files that we'll create
            string File1 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "File1.pdf");
            string File2 = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "File2.pdf");

            //Create a test file to merge into the second file
            using (FileStream fs = new FileStream(File1, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                //We'll create this one landscape to show some checks that need to be done later
                using (Document doc = new Document(PageSize.TABLOID.Rotate()))
                {
                    using (PdfWriter writer = PdfWriter.GetInstance(doc, fs))
                    {
                        doc.Open();
                        doc.Add(new Paragraph("File 1"));
                        doc.Close();
                    }
                }
            }

            //Create our second file
            using (FileStream fs = new FileStream(File2, FileMode.Create, FileAccess.Write, FileShare.None))
            {
                //Create this one as a regular US Letter portrait sized document
                using (Document doc = new Document(PageSize.LETTER))
                {
                    using (PdfWriter writer = PdfWriter.GetInstance(doc, fs))
                    {
                        doc.Open();

                        doc.Add(new Paragraph("File 2"));

                        //Create a PdfReader to read our first file
                        PdfReader r = new PdfReader(File1);

                        //Store the number of pages
                        int pageCount = r.NumberOfPages;

                        //Variables which will be set in the loop below
                        iTextSharp.text.Rectangle rect;
                        PdfImportedPage imp;

                        //Loop through each page in the source document, remember that page indexes start a one and not zero
                        for (int i = 1; i <= pageCount; i++)
                        {
                            //Get the page's dimension and rotation
                            rect = r.GetPageSizeWithRotation(i);

                            //Get the actual page
                            imp = writer.GetImportedPage(r, i);

                            //These two commands must happen in this order
                            //First change the "default page size" to match the current page's size
                            doc.SetPageSize(rect);
                            //then add a new blank page which we'll fill with our actual page
                            doc.NewPage();

                            //If the document has been rotated one twist left or right (90 degrees) then we need to add it a little differently
                            if (rect.Rotation == 90 || rect.Rotation == 270)
                            {
                                //Add the page accounting for the rotation
                                writer.DirectContent.AddTemplate(imp, 0, -1, 1, 0, 0, rect.Height);
                            }
                            else
                            {
                                //Add the page normally
                                writer.DirectContent.AddTemplate(imp, 0, 0);
                            }

                        }

                        doc.Close();
                    }
                }
            }
            this.Close();
        }
    }
}


来源:https://stackoverflow.com/questions/8228605/is-document-doc-addpdf-possible

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!