2010-11-25 14 views
8

Ich versuche PdfSmartCopy von iTextSharp zu verwenden, aber ich kann keine relevanten Beispiele in C# finden.iTextSharp PdfCopy Anwendungsbeispiele

Die Idee ist, dass ich ein PDF mit Formularfeldern und die Felder hinzufügen 700kb auf die Größe des PDF-Dokuments haben. Das Originaldokument ohne Formularfelder war 100kb. Alle anderen Vorschläge sind willkommen, vor allem o reduzieren Sie die PDF-Größe konsequent.

(I optimiert das erzeugte PDF mit Adobe Acrobat, und es reduziert sie 44kb. Es gibt also eine Störung irgendwo sein muss.) Gibt es eine Möglichkeit, die PDF-Größe zu reduzieren?

Bearbeiten: FormFlatenning hilft nicht. Die PDF-Vorlagendatei enthält nur Text, Zeilen und Tabellen, keine Bilder.

hier ist mein Code-Schnipsel

 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

Ihre Frage Titel erwähnt PdfSmartCopy, aber Ihre Quelle nicht. –

+1

Ich frage nach Quellcode, nicht zur Verfügung stellen. –

Antwort

7

Hier ist ein VB.Net-Beispiel 2008, das ITextSharp PDFCopy verwendet, um mehrere PDF-Dateien in eine mehrseitige PDF-Datei zu kopieren. Dies kopiert alles außer den zugrunde liegenden Links. Es scheint, alle Anmerkungen perfekt zu kopieren, zumindest konnte ich keine finden, die es nicht kopierte.

Hinweis: Sie müssen ITextSharp in Ihrem Projekt referenzieren.

Eingabeparameter:

fileArray - eine Reihe von PDF-Dateien.

outPutPDF - vollständiger Pfad und Name für die Ausgabe eines mehrseitigen PDF-Dokuments.

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 
+0

Eigentlich möchte ich die Daten aus der PDF-Datei extrahieren mit dem iTextSharp die Datei enthält Daten in einem Tabellenformat, ich muss die Daten extrahieren, bitte geben Sie mir ein Beispiel –

1

Anruf reader.removeUnusedObjects() vor pst.close() Aufruf ... keine Notwendigkeit für Abflachung.

Um die Dinge ein wenig mehr zu verkleinern, können Sie pst.setFullCompression(). YMMV.

EDIT: Soweit Beispiele gehen, empfehle ich, iText in Aktion, 2. Auflage. Viele Beispiele für alle möglichen Dinge, einschließlich PdfCopy & PdfSmartCopy. Alle Codebeispiele aus dem Buch sind available on line.

Ich mache kein Geld, wenn Sie das Buch kaufen, sondern den Autor von zahlreichen Online-Interaktionen kennen, und ihn als einen Freund betrachten.

+0

Danke für die Antwort, ich habe es geschafft, eine kleinere PDF-Datei zu erstellen, indem ich die Vorlage mit OpenOffice anstelle von Adobe Acrobat erstellte. 80 kb vs 800 kb. –

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