ITextSharp PdfCopy 使用示例

Posted

技术标签:

【中文标题】ITextSharp PdfCopy 使用示例【英文标题】:ITextSharp PdfCopy use examples 【发布时间】:2011-05-15 15:08:25 【问题描述】:

我正在尝试使用 ItextSharp 中的 PdfSmartCopy,但在 c# 中找不到任何相关示例。

我的想法是我有一个包含表单字段的 pdf,并且这些字段将 700kb 添加到 pdf 文档的大小。没有表单域的原始文档为 100kb。 欢迎任何其他建议,尤其是不断减小 pdf 大小。

(我用adobe acrobat优化了生成的PDF,将其缩小到44kb。所以一定是哪里出了问题。) 有什么办法可以减小 PDF 的大小?

编辑:FormFlatenning 没有帮助。 pdf 模板文件只包含文本、行和表格,没有图像。

这是我的代码 sn-p

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

【问题讨论】:

您的问题标题提到了 PdfSmartCopy,但您的来源没有。 我要源代码,不提供。 【参考方案1】:

这是一个 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

【讨论】:

其实我想使用 iTextSharp 从 PDF 文件中提取数据,该文件包含表格格式的数据,我需要提取数据请给我一个例子【参考方案2】:

在调用pst.close()之前调用reader.removeUnusedObjects()...无需展平。

要进一步缩小内容,您可以pst.setFullCompression()。 YMMV。

编辑:就示例而言,我建议获取 iText in Action,第 2 版。里面有很多各种各样的例子,包括 PdfCopy 和 PdfSmartCopy。书中所有代码示例均为available on line。

如果你买这本书,我不赚钱,但通过许多在线互动认识作者,并把他当作朋友。

【讨论】:

感谢您的回答,我设法通过使用 OpenOffice 而不是 Adob​​e Acrobat 创建模板来制作更小的 pdf 文件。 80kb 与 800kb。【参考方案3】:

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

【讨论】:

以上是关于ITextSharp PdfCopy 使用示例的主要内容,如果未能解决你的问题,请参考以下文章

使用itextsharp.dll生成PDF [关闭]

使用 iTextSharp 的后备字体

使用 itextsharp 获取 PDF 页面的缩略图

ITextSharp v5.5.13.0 XMLWorker土耳其语字符问题

如何使用 iTextSharp 4.1.6 提取文本?

使用 ITextSharp 将 HTML 文件转换为 PDF 文件