2010-11-25 3 views
8

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

Идея заключается в том, что у меня есть pdf-форма, а поля добавляются 700kb к размеру pdf-документа. Исходный документ без полей формы был 100kb. Любые другие предложения приветствуются, особенно o последовательно уменьшайте размер 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(); 
+1

Ваш вопрос название упоминает PdfSmartCopy, но ваш источник не делает. – 2010-12-01 00:57:46

+1

Я прошу исходный код, не предоставляя его. – 2010-12-07 09:12:19

ответ

7

Вот пример использования VB.Net в 2008 году с помощью ITextSharp PDFCopy для копирования нескольких PDF-файлов в один многостраничный файл 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

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

Чтобы убрать предметы еще немного, вы можете pst.setFullCompression(). YMMV.

EDIT: Что касается примеров, я рекомендую получить iText в действии, второе издание. Множество примеров всех видов вещей, в том числе PdfCopy & PdfSmartCopy. Все примеры кода из книги: available on line.

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

+0

Спасибо за ответ, мне удалось создать меньший pdf-файл, создав шаблон с использованием OpenOffice, а не Adobe Acrobat. 80kb vs 800 kb. – 2010-12-06 14:31:15

0

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(); 
 
    }

Смежные вопросы