Почему iTextSharp меняет размеры моих документов, а не просто объединяет их? - PullRequest
2 голосов
/ 06 октября 2010

Пример кода:

using System;
using System.IO;
using System.Collections.Generic;
using System.Text;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace MergePDFs
{
    class Program
    {
        static void Main(string[] args)
        {

            try
            {
                int f = 1;
                // we create a reader for a certain document
                PdfReader reader = new PdfReader(args[f]);
                // we retrieve the total number of pagse
                int n = reader.NumberOfPages;
                Console.WriteLine("There are " + n + " pages in the original file.");
                // step 1: creation of a document-object
                Document document = new Document(reader.GetPageSizeWithRotation(1));
                Console.WriteLine("PS: " + reader.GetPageSizeWithRotation(1));
                // step 2: we create a writer that listens to the document
                String destinationFile = args[0];//The first argument is the destination
                PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(destinationFile, FileMode.Create));
                // step 3: we open the document
                document.Open();
                PdfContentByte cb = writer.DirectContent;
                PdfImportedPage page;
                int rotation;
                // step 4: we add content
                while (f < args.Length)
                {
                    int i = 0;
                    while (i < n)
                    {
                        i++;
                        //document.SetPageSize(reader.GetPageSizeWithRotation(i));
                        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 < args.Length)
                    {
                        reader = new PdfReader(args[f]);
                        // we retrieve the total number of pages
                        n = reader.NumberOfPages;
                        Console.WriteLine("There are " + n + " pages in the original file.");
                    }
                }
                // step 5: we close the document
                document.Close();
            }
            catch (Exception e)
            {
                Console.Error.WriteLine(e.Message);
                Console.Error.WriteLine(e.StackTrace);
            }
        }
    }
}

Я ожидал бы, что это выведет документ тех же размеров, что и два приходящих документа (которые в моем случае имеют одинаковый размер). К сожалению, этого не происходит, и вокруг объединенного документа печатается белая рамка. Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

Вполне возможно, что у оригинальных PDF-файлов есть боксы обрезки в дополнение к их полям мультимедиа.

Если вы действительно просто хотите скопировать страницы из файлов A и B в файл C, используйте PdfCopy.

С http://itextpdf.com/examples/iia.php?id=123

    String[] files = { MovieLinks1.RESULT, MovieHistory.RESULT };
    // step 1
    Document document = new Document();
    // step 2
    PdfCopy copy = new PdfCopy(document, new FileOutputStream(RESULT));
    // step 3
    document.open();
    // step 4
    PdfReader reader;
    int n;
    // loop over the documents you want to concatenate
    for (int i = 0; i < files.length; i++) {
        reader = new PdfReader(files[i]);
        // loop over the pages in that document
        n = reader.getNumberOfPages();
        for (int page = 0; page < n; ) {
            copy.addPage(copy.getImportedPage(reader, ++page));
        }
    }
    // step 5
    document.close();

Этот метод будет сохранять аннотации (включая поля, хотя вы действительно должны использовать PdfCopyFields, если вы хотите перемещать поля вокруг PROPERLY), но не закладки. Я не уверен насчет слоев ... Я так думаю.

О, и вы, вероятно, захотите добавить copy.freeReader(reader) после того, как закончите с каждым ... особенно, если вы планируете циклически проходить через многие из них.

0 голосов
/ 19 ноября 2010

Попробуйте

cb.AddTemplate(page, 0, 0);
...