2010-11-25 114 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(); 
 
    }