开发者

iText Merge PDF with cropbox

开发者 https://www.devze.com 2023-03-19 20:00 出处:网络
Does any know how to merge two pdf (one of them have cropbox and the other don\'t have, and they have different page size) using iText?

Does any know how to merge two pdf (one of them have cropbox and the other don't have, and they have different page size) using iText?

here is the code, that I use for PDF merge:

public bool MergeFiles(string destinationFile, string[] sourceFiles)
    {
        bool bSucess = true;

        if (System.IO.File.Exists(destinationFile))
            System.IO.File.Delete(destinationFile);

        string[] sSrcFile;
        sSrcFile = new string[2];


        string[] arr = new string[2];
        for (int i = 0; i <= sourceFiles.Length - 1; i++)
        {
            if (sourceFiles[i] != null)
            {
                if (sourceFiles[i].Trim() != "")
                    arr[i] = sourceFiles[i].ToString();
            }
        }

        if (arr != null)
        {

            sSrcFile = new string[2];

            for (int ic = 0; ic <= arr.Length - 1; ic++)
            {
                sSrcFile[ic] = arr[ic].ToString();
            }
        }

        string sPDFPath = Server.MapPath(@"pdftemp/");
        Scripting.FileSystemObject fso = new Scripting.FileSystemObjectClass();


        try
        {
            int f = 0;

            PdfReader reader = new PdfReader(sSrcFile[f]);
            int n = reader.NumberOfPages;
            Console.WriteLine("There are " + n + " pages in the original file.");
            Document document = new Document(PageSize.A4);

            PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(destinationFile, FileMode.Create));
            PdfDate st = new PdfDate(DateTime.Today);


            document.Open();
            PdfContentByte cb = writer.DirectContent;
            PdfImportedPage page;

            int rotation;
            while (f < sSrcFile.Length)
            {
                int i = 0;
                while (i < n)
                {
                    i++;

                    document.SetPageSize(PageSize.A4);
                    document.NewPage();
                    page = writer.GetImportedPage(reader, i);

                    rotation = reader.GetPageRotation(i);
                    if (rotation == 90 || rotation == 270)
                    {
                        cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(i).Height);
                    }
                    else
                    {
                        cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                    }
                    Console.WriteLine("Processed page " + i);
                }

                f++;
                if (f < sSrcFile.Length)
                {
                    reader = new PdfReader(sSrcFile[f]);
                    n = reader.NumberOfPages;
                    Console.WriteLine("There are " + n + " pages in the original file.");
                }
            }

            document.Close();

        }
        catch (Exception e)
        {
            bSucess = false;
        }

        return bSucess;
    }

But it seems not handling cropbox difference between pages (content mis-position on page that have cropbox) , anyone have a better code to put the conten开发者_StackOverflowt in the right position?


You're doing it the hard way:

PdfReader reader = null;
PdfCopy copier = new PdfCopy(outputStream);
String paths[] = ...;
for (String path : paths) {
  reader = new PdfReader(path);
  for (int pageNum = 1; pageNum <= reader.getNumberOfPages(); ++pageNum) {
    copier.addPage(copier.getImportedPage(reader, pageNum) );
  }
}

That'll copy page annotations as well as page contents. Note that it Will Not copy document-level stuff those annotations might need to function properly (document script for a form fields' validation entry point for example).

And it'll copy the original page verbatim, regardless of various page box sizes or rotation.

0

精彩评论

暂无评论...
验证码 换一张
取 消