Ejemplos de uso de ITextSharp PdfCopy

Estoy intentando usar PdfSmartCopy desde ItextSharp pero no puedo encontrar ningún ejemplo relevante en c #.

La idea es que tengo un pdf que contiene campos de formulario y los campos agregan 700kb al tamaño del documento pdf. El documento original sin campos de formulario fue de 100kb . Cualquier otra sugerencia es bienvenida, especialmente para reducir el tamaño del PDF de forma consistente.

(Optimicé el PDF generado con Adobe Acrobat y lo reduje a 44 KB . Por lo tanto, debe haber una falla en algún lugar). ¿Hay alguna forma de reducir el tamaño del PDF?

Edición: FormFlatenning no ayuda. El archivo de plantilla pdf solo contiene texto, líneas y tablas, no imágenes.

aquí está mi fragmento de código

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

Aquí hay un ejemplo de VB.Net 2008 del uso de ITextSharp PDFCopy para copiar múltiples archivos PDF en 1 archivo PDF de varias páginas. Esto copiará todo excepto los enlaces subyacentes. Parece copiar todas las anotaciones a la perfección, al menos no pude encontrar ninguna que no haya copiado.

Nota: debe tener referencia a ITextSharp en su proyecto.

Parámetros de entrada:

fileArray – una matriz de archivos pdf.

outPutPDF: ruta completa y nombre para generar documentos PDF de varias páginas.

 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 

Llame a reader.removeUnusedObjects() antes de llamar a pst.close() … no es necesario aplanar.

Para reducir un poco más las cosas puedes pst.setFullCompression() . YMMV.

EDITAR: En cuanto a los ejemplos, recomiendo obtener iText en Acción, 2ª edición. Muchos ejemplos de todo tipo de cosas allí, incluyendo PdfCopy y PdfSmartCopy. Todas las muestras de código del libro están disponibles en línea .

No gano dinero si compra el libro, pero conozco al autor por numerosas interacciones en línea y considérelo un amigo.

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