2010-11-25 211 views
8

我正在嘗試使用PdfSmartCopyItextSharp但我無法在c#中找到任何相關示例。ITextSharp PdfCopy使用示例

ideea是我有一個PDF包含表單域和字段添加到pdf文檔的大小700kb。沒有表單域的原始文件是100kb。 歡迎任何其他提示,尤其是o一致縮小pdf大小。

(我優化使用Adobe Acrobat生成的PDF,而且它降低到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

這是2008年的VB.Net使用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

呼叫​​調用pst.close()前...無需壓扁。

要縮小一點點,你可以pst.setFullCompression()。因人而異。

編輯:就例子而言,我建議讓iText在行動,第二版。很多這裏的各種事物的例子,包括PdfCopy & PdfSmartCopy。本書中的所有代碼示例均爲available on line

如果你買這本書,我不會賺錢,但是從衆多的在線互動中瞭解作者,並認爲他是朋友。

+0

感謝您的回答,我設法通過使用OpenOffice而不是Adobe Acrobat創建模板來製作更小的pdf文件。 80kb對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(); 
 
    }