ITextSharp PdfCopy примеры использования - PullRequest
8 голосов
/ 25 ноября 2010

Я пытаюсь использовать PdfSmartCopy из ItextSharp , но я не могу найти соответствующие примеры в c #.

Идея состоит в том, что у меня есть PDF, содержащий поля формы, и поля добавляют 700 КБ к размеру документа PDF. Исходный документ без полей формы был 100kb . Любые другие предложения приветствуются, особенно для последовательного уменьшения размера PDF.

(Я оптимизировал сгенерированный PDF с помощью Adobe Acrobat, и он уменьшил его до 44kb . Так что где-то должен быть сбой.) Есть ли способ уменьшить размер PDF?

Редактировать: FormFlatenning не помогает. Файл шаблона pdf содержит только текст, строки и таблицы, без изображений.

вот мой фрагмент кода

        PdfReader reader = new PdfReader(GetTemplateBytes());
        pst = new PdfStamper(reader, Response.OutputStream);
        var acroFields = pst.AcroFields;

        pst.FormFlattening = true;
        pst.FreeTextFlattening = true;

        SetFieldsInternal(acroFields);

        pst.Close();

Ответы [ 3 ]

7 голосов
/ 06 декабря 2010

Вот пример VB.Net 2008 года использования ITextSharp PDFCopy для копирования нескольких файлов PDF в 1 многостраничный файл PDF. Это скопирует все, кроме основных ссылок. Похоже, что все примечания полностью скопированы, по крайней мере, я не смог найти ни одного, который он не скопировал.

Примечание. В вашем проекте должна быть ссылка на ITextSharp.

Входные параметры:

fileArray - массив файлов pdf.

outPutPDF - полный путь и имя для вывода многостраничного PDF-документа.

Private Sub BuildMultiPagePDF(ByVal fileArray As String(), ByVal outPutPDF As String)
    Try

        Dim reader As iTextSharp.text.pdf.PdfReader = Nothing
        Dim pageCount As Integer = 0
        Dim currentPage As Integer = 0
        Dim pdfDoc As iTextSharp.text.Document = Nothing
        Dim writer As iTextSharp.text.pdf.PdfCopy = Nothing
        Dim page As iTextSharp.text.pdf.PdfImportedPage = Nothing
        Dim currentPDF As Integer = 0 

        If fileArray.Length > 0 Then

            reader = New iTextSharp.text.pdf.PdfReader(fileArray(currentPDF))
            pdfDoc = New iTextSharp.text.Document(reader.GetPageSizeWithRotation(1))
            writer = New iTextSharp.text.pdf.PdfCopy(pdfDoc, _
                                                  New IO.FileStream(outPutPDF, _
                                                  IO.FileMode.OpenOrCreate, _
                                                  IO.FileAccess.Write))

            pageCount = reader.NumberOfPages

            While currentPDF < fileArray.Length
                pdfDoc.Open()

                While currentPage < pageCount
                    currentPage += 1
                    pdfDoc.SetPageSize(reader.GetPageSizeWithRotation(currentPage))
                    pdfDoc.NewPage()
                    page = writer.GetImportedPage(reader, currentPage)
                    writer.AddPage(page)
                End While

                currentPDF += 1
                If currentPDF < fileArray.Length Then
                    reader = New iTextSharp.text.pdf.PdfReader(fileArray(currentPDF))
                    pageCount = reader.NumberOfPages
                    currentPage = 0
                End If
            End While

            pdfDoc.Close()
        Else
            MessageBox.Show("The input file array is empty.  Processing terminated.", _
                            "INVALID FILE LIST", _
                            MessageBoxButtons.OK, MessageBoxIcon.Error)

        End If

    Catch ex As Exception
        MessageBox.Show(ex.message)
    End Try
End Sub
1 голос
/ 01 декабря 2010

Позвоните reader.removeUnusedObjects() перед вызовом pst.close() ... нет необходимости в выравнивании.

Чтобы уменьшить вещи немного больше, вы можете pst.setFullCompression(). YMMV.

РЕДАКТИРОВАТЬ: Что касается примеров, я рекомендую получить iText в действии, 2-е издание. Там много примеров всевозможных вещей, в том числе PdfCopy и PdfSmartCopy. Все примеры кода из книги доступны в сети .

Я не зарабатываю деньги, если вы покупаете книгу, но знаете автора по многочисленным интерактивным взаимодействиям и считаете его своим другом.

0 голосов
/ 26 сентября 2017

using iTextSharp.text;
using iTextSharp.text.pdf;

public void pdfcopyfile()
    {
        string pdfTemplatePath = @"D:\1.pdf";
        string outputPdfPath = @"D:\44.pdf";
        iTextSharp.text.pdf.PdfReader reader = null;
        int pageCount = 0;
        int currentPage = 0;
        Document pdfDoc = null;
        PdfCopy writer = null;
        PdfImportedPage page = null;
        reader = new PdfReader(pdfTemplatePath);
        pdfDoc = new Document(reader.GetPageSizeWithRotation(1));
        writer = new PdfCopy(pdfDoc, new System.IO.FileStream(outputPdfPath, System.IO.FileMode.Create));
        pageCount = reader.NumberOfPages;
        pdfDoc.Open();
        while (currentPage < pageCount)
        {
            currentPage += 1;
            pdfDoc.SetPageSize(reader.GetPageSizeWithRotation(currentPage));
            pdfDoc.NewPage();
            page = writer.GetImportedPage(reader, currentPage);
            writer.AddPage(page);
        }
        reader = new PdfReader(pdfTemplatePath);
        pageCount = reader.NumberOfPages;
        currentPage = 0;
        pdfDoc.Close();
    }
...