c# - ITextSharp PdfCopy 使用实例

标签 c# asp.net pdf-generation itextsharp

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

我的想法是我有一个包含表单字段的 pdf,并且这些字段将 700kb 添加到 pdf 文档的大小。没有表单字段的原始文档是 100kb。 欢迎提出任何其他建议,尤其是始终如一地减小 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();

最佳答案

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

关于c# - ITextSharp PdfCopy 使用实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4276019/

相关文章:

c# - 用于嵌套查询的 RavenDB 索引

c# - 在 Entity Framework 数据库迁移期间应如何运行自定义代码?

c# - 如何使用 LINQ 加入、分组和选择?

c# - 按键比较两个字典以获得匹配键的值

ruby-on-rails-3 - 如何在 Rails 3 中使用 IO.popen 和 wkhtmltopdf 创建带页眉/页脚的 PDF

c# - 使用 StringBuilder 编写 XML 可以吗?

c# - 存储库模式是否遵循 SOLID 原则?

c# - 绑定(bind)到数据表时如何设置gridview列宽

html - 从 Twig 模板生成 pdf 文件

css - 如何将自定义颜色应用于 PdfPCell 的背景?