ITextSharp - объединение двух PDF-файлов на одной странице - PullRequest
5 голосов
/ 03 ноября 2010

Я задам этот вопрос простыми словами.

У меня есть этот pdf:

 _____
|abcd |
|     |
|     |
|_____|

А вот этот:

 _____
|1234 |
|4567 |
|     |
|_____|

Я хочу объединить их, чтобы получить:

 _____
|abcd |
|1234 |
|4567 |
|_____|

Можно ли использовать iTextSharp или любой другой бесплатный инструмент?

Заранее спасибо

Ответы [ 3 ]

3 голосов
/ 16 июля 2013

это старый вопрос ... но если кто-то снова войдет сюда, мое решение было следующим ... я сделал это жестко для двух страниц на одной странице, так что это основы сначала я повернул два файла PDF, после чего объединил их

для поворота двух страниц используйте это:

 public static void RotatePDF(string inputFile, string outputFile)
    {
        using (FileStream outStream = new FileStream(outputFile, FileMode.Create))
        {
            iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(inputFile);
            iTextSharp.text.pdf.PdfStamper stamper = new iTextSharp.text.pdf.PdfStamper(reader, outStream);

            iTextSharp.text.pdf.PdfDictionary pageDict = reader.GetPageN(1);
            int desiredRot = 90; // 90 degrees clockwise from what it is now
            iTextSharp.text.pdf.PdfNumber rotation = pageDict.GetAsNumber(iTextSharp.text.pdf.PdfName.ROTATE);

            if (rotation != null)
            {
                desiredRot += rotation.IntValue;
                desiredRot %= 360; // must be 0, 90, 180, or 270
            }
            pageDict.Put(iTextSharp.text.pdf.PdfName.ROTATE, new iTextSharp.text.pdf.PdfNumber(desiredRot));

            stamper.Close();
        }
    }

Теперь вы можете объединить их:

        public static void MergeTwoPdfsToSingle(string inputFile1, string inputFile2, string outputFile)
    {
        //Step 1: Create a Docuement-Object
        Document document = new Document();
        try
        {
            //Step 2: we create a writer that listens to the document
            PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(outputFile, FileMode.Create));

            //Step 3: Open the document
            document.Open();

            PdfContentByte cb = writer.DirectContent;
            PdfImportedPage page1;
            PdfImportedPage page2;                

            // we create a reader for the document
            PdfReader reader1 = new PdfReader(inputFile1);
            PdfReader reader2 = new PdfReader(inputFile2);

            document.SetPageSize(reader1.GetPageSizeWithRotation(1));
            document.NewPage();

            page1 = writer.GetImportedPage(reader1, 1);                                

            page2 = writer.GetImportedPage(reader2, 1);                

            cb.AddTemplate(page1, 0, 0);
            //play around to find the exact location for the next pdf
            cb.AddTemplate(page2, 0, 300);
        }
        catch (Exception e) { throw e; }
        finally { document.Close(); }
    }
0 голосов
/ 04 ноября 2010

Мы использовали продукт под названием PDFMerger, который будет делать именно это. Это не было дешево однако. На самом деле мы не нашли ничего другого, что могло бы легко это сделать.

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

Да ... это просто очень сложно, даже для PDF Expert.Задавая вопрос, вы показали, что вы не один ... по крайней мере, пока.Снимите это, и вы будете в пути ... Но:

Нет простого способа определить ограничивающую рамку, которая окружает весь контент на данной странице.com.itextpdf.text.pdf.parser (или его # эквивалент) имеет несколько классов, которые могут помочь вам в этом, но суть в том, что PDF не предназначен для такого анализа.

I настоятельно рекомендуем попробовать другой подход.Все, что включает фразу «а затем мы получаем информацию из PDF», нуждается в капитальном ремонте.О, это возможно, но есть почти всегда лучший способ сделать это.

...