当内容较长时,itextsharp 不会创建新页面

2024-01-21

我尝试从 3 天开始寻找制作一份 pdf 文档的方法,如果有任何帮助,我将不胜感激。

我有几个表单字段可以毫无问题地访问和填写。我想在此字段下方放置动态创建的表。该表可以足够长,可以包含多个页面。这是我的问题。我无法将此表添加到其下方带有表单字段的同一页面上。我找到了合并 pdf 文件的示例。现在我有这样的场景。

  1. 制作一份包含填写表单字段的 pdf
  2. 用pdfTable制作pdf,总是只有一页,但内容较长
  3. 制作 pdf,将前两个合并。第一页是填写的表单字段,第二页是我的 pdfTable。

我只想拥有从第一页开始并在下一页继续的表单字段和表格。

我发布了我的代码,有点混乱,但是......

string pdfTemplate = Server.MapPath("~/PDF/") + "invoiceTest.pdf";
        string newFile = Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf";

        using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Create))
        using (FileStream formFile = new FileStream(Server.MapPath("~/PDF/") + "invoiceTest.pdf", FileMode.Open))
        {
            PdfReader reader = new PdfReader(formFile);
            using (Document document = new Document(reader.GetPageSizeWithRotation(1)))
            {
                PdfStamper outStamper = new PdfStamper(reader, ms);
                PdfContentByte body = outStamper.GetOverContent(reader.NumberOfPages);

                document.Open(); //Open document to work with

                AcroFields fields = outStamper.AcroFields;

                BaseFont bfComic = BaseFont.CreateFont(Server.MapPath("~/PDF/") + "trebuc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                Font font = new Font(bfComic, 12);

                // UPDATE THE FORM FIELDS
                fields.SetFieldProperty("txtContragentName", "textfont", bfComic, null);
                fields.SetField("txtContragentName", "Фрея");
                fields.SetFieldProperty("txtContragentCode", "textfont", bfComic, null);
                fields.SetField("txtContragentCode", "DGB34TT");
                fields.SetFieldProperty("txtDateCreated", "textfont", bfComic, null);
                fields.SetField("txtDateCreated", "03.06.2013");

                outStamper.Close();
            }
        }

        using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 2 + ".pdf", FileMode.Create))
        using (FileStream formFile = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Open))
        {
            PdfReader reader = new PdfReader(formFile);
            using (Document document = new Document(reader.GetPageSizeWithRotation(1)))
            {
                PdfWriter writer = PdfWriter.GetInstance(document, ms);
                document.Open();
                //Paragraph heading = new Paragraph("Page Heading", new Font(Font.FontFamily.HELVETICA, 10f, Font.BOLD));
                //heading.SpacingAfter = 8f;
                //doc.Add(heading);
                string text = @"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Suspendisse blandit blandit turpis. Nam in lectus ut dolor consectetuer bibendum. Morbi neque ipsum, laoreet id; dignissim et, viverra id, mauris. Nulla mauris elit, consectetuer sit amet, accumsan eget, congue ac, libero. Vivamus suscipit. Nunc dignissim consectetuer lectus. Fusce elit nisi; commodo non, facilisis quis, hendrerit eu, dolor? Suspendisse eleifend nisi ut magna. Phasellus id lectus! Vivamus laoreet enim et dolor. Integer arcu mauris, ultricies vel, porta quis, venenatis at, libero. Donec nibh est, adipiscing et, ullamcorper vitae, placerat at, diam. Integer ac turpis vel ligula rutrum auctor! Morbi egestas erat sit amet diam. Ut ut ipsum? Aliquam non sem. Nulla risus eros, mollis quis, blandit ut; luctus eget, urna. Vestibulum vestibulum dapibus erat. Proin egestas leo a metus?";
                PdfContentByte cb = writer.DirectContent;
                ColumnText columns = new ColumnText(cb);
                //float left, float right, float gutterwidth, int numcolumns
                columns.SetSimpleColumn(40, 20, document.PageSize.Width - 40, document.PageSize.Height - 20);
                //Paragraph para = new Paragraph(text, new Font(Font.FontFamily.HELVETICA, 8f));
                ////para.SpacingAfter = 9f;
                //para.Alignment = Element.ALIGN_JUSTIFIED;
                //for (int i = 0; i < 28; i++)
                //{
                //    columns.AddElement(para);
                //}

                //columns.Go();

                BaseFont bfComic = BaseFont.CreateFont(Server.MapPath("~/PDF/") + "trebuc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
                Font font = new Font(bfComic, 12);
                PdfPTable table = new PdfPTable(10);
                table.HorizontalAlignment = Element.ALIGN_LEFT;
                table.DefaultCell.HorizontalAlignment = Element.ALIGN_RIGHT;
                table.WidthPercentage = 100;
                PdfPCell cell1 = new PdfPCell(new Phrase("ДАТА", new Font(bfComic, 10f, Font.NORMAL, BaseColor.WHITE))) { HorizontalAlignment = 1, VerticalAlignment = 2 };
                cell1.BackgroundColor = new iTextSharp.text.BaseColor(System.Drawing.ColorTranslator.FromHtml("#808080"));

                PdfPCell cell2 = new PdfPCell(new Phrase("Header spanning 3 columns", new Font(Font.NORMAL, 10f, Font.NORMAL, BaseColor.WHITE))) { HorizontalAlignment = 1 };
                cell2.BackgroundColor = new iTextSharp.text.BaseColor(System.Drawing.ColorTranslator.FromHtml("#808080"));

                table.AddCell(cell1);
                table.AddCell(cell2);
                //dump data to be set
                #region dump data
                for (int i = 0; i < 100; i++)
                {
                    table.AddCell("Col 1 Row 1");
                }

                #endregion

                float[] widths = new float[] { 200f, 200f, 200f, 200f, 100f, 100f, 100f, 100f, 100f, 100f };
                table.SetWidths(widths);
                table.CompleteRow(); //Added - table won't add the final row if its cells are incomplete - safe to have it ending a table
                columns.AddElement(table);
                columns.Go();
            }
        }

        using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 3 + ".pdf", FileMode.Create))
        using (FileStream stampedfile = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Open))
        using (FileStream appendfile = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 2 + ".pdf", FileMode.Open))
        {
            PdfReader stampedContentReader = new PdfReader(stampedfile);
            PdfReader appendContentReader = new PdfReader(appendfile);

            using (Document document = new Document(stampedContentReader.GetPageSizeWithRotation(1)))
            {
                PdfCopy pdfCopy = new PdfCopy(document, ms);

                document.Open();

                for (int i = 1; i <= stampedContentReader.NumberOfPages; i++)
                    pdfCopy.AddPage(pdfCopy.GetImportedPage(stampedContentReader, i));

                for (int i = 1; i <= appendContentReader.NumberOfPages; i++)
                    pdfCopy.AddPage(pdfCopy.GetImportedPage(appendContentReader, i));
            }
        }

你的代码确实是一团糟。我将复制/粘贴它,但请理解我不是 C# 开发人员。我只懂 Java,而且我对 iText 了如指掌(我是它的原始开发人员)。

string pdfTemplate = Server.MapPath("~/PDF/") + "invoiceTest.pdf";
string newFile = Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf";

using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Create))
using (FileStream formFile = new FileStream(Server.MapPath("~/PDF/") + "invoiceTest.pdf", FileMode.Open))
{
    PdfReader reader = new PdfReader(formFile);
    // YOU DON'T NEED A DOCUMENT OBJECT HERE!
    // READ THE DOCUMENTATION!!!
    PdfStamper outStamper = new PdfStamper(reader, ms);
    AcroFields fields = outStamper.AcroFields;
    BaseFont bfComic = BaseFont.CreateFont(Server.MapPath("~/PDF/") + "trebuc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
    // UPDATE THE FORM FIELDS
    fields.SetFieldProperty("txtContragentName", "textfont", bfComic, null);
    fields.SetField("txtContragentName", "Фрея");
    fields.SetFieldProperty("txtContragentCode", "textfont", bfComic, null);
    fields.SetField("txtContragentCode", "DGB34TT");
    fields.SetFieldProperty("txtDateCreated", "textfont", bfComic, null);
    fields.SetField("txtDateCreated", "03.06.2013");
    outStamper.Close();
}

using (FileStream ms = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 2 + ".pdf", FileMode.Create))
using (FileStream formFile = new FileStream(Server.MapPath("~/PDF/") + "invoice" + 1 + ".pdf", FileMode.Open))
{
    PdfReader reader = new PdfReader(formFile);
    // I'm adding extra parameters to change the margins so that they match what you had when you defined your ColumnText object
    using (Document document = new Document(reader.GetPageSizeWithRotation(1), 40, 40, 20, 20))
    {
        PdfWriter writer = PdfWriter.GetInstance(document, ms);
        document.Open();
        // HEADERS ARE ADDED WITH PAGE EVENTS!!!
        // PLEASE READ ABOUT PAGE EVENTS IF YOU NEED PAGE HEADERS
        string text = @"Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Suspendisse blandit blandit turpis. Nam in lectus ut dolor consectetuer bibendum. Morbi neque ipsum, laoreet id; dignissim et, viverra id, mauris. Nulla mauris elit, consectetuer sit amet, accumsan eget, congue ac, libero. Vivamus suscipit. Nunc dignissim consectetuer lectus. Fusce elit nisi; commodo non, facilisis quis, hendrerit eu, dolor? Suspendisse eleifend nisi ut magna. Phasellus id lectus! Vivamus laoreet enim et dolor. Integer arcu mauris, ultricies vel, porta quis, venenatis at, libero. Donec nibh est, adipiscing et, ullamcorper vitae, placerat at, diam. Integer ac turpis vel ligula rutrum auctor! Morbi egestas erat sit amet diam. Ut ut ipsum? Aliquam non sem. Nulla risus eros, mollis quis, blandit ut; luctus eget, urna. Vestibulum vestibulum dapibus erat. Proin egestas leo a metus?";
        BaseFont bfComic = BaseFont.CreateFont(Server.MapPath("~/PDF/") + "trebuc.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        Font font = new Font(bfComic, 12);
        PdfPTable table = new PdfPTable(10);
        // The next line doesn't make sense if the width percentage is 100%
        // table.HorizontalAlignment = Element.ALIGN_LEFT;
        table.DefaultCell.HorizontalAlignment = Element.ALIGN_RIGHT;
        table.WidthPercentage = 100;
        PdfPCell cell1 = new PdfPCell(new Phrase("ДАТА", new Font(bfComic, 10f, Font.NORMAL, BaseColor.WHITE))) { HorizontalAlignment = 1, VerticalAlignment = 2 };
        cell1.BackgroundColor = new iTextSharp.text.BaseColor(System.Drawing.ColorTranslator.FromHtml("#808080"));
        PdfPCell cell2 = new PdfPCell(new Phrase("Header spanning 3 columns", new Font(Font.NORMAL, 10f, Font.NORMAL, BaseColor.WHITE))) { HorizontalAlignment = 1 };
        cell2.BackgroundColor = new iTextSharp.text.BaseColor(System.Drawing.ColorTranslator.FromHtml("#808080"));
        table.AddCell(cell1);
        table.AddCell(cell2);
        //dump data to be set
        #region dump data
        for (int i = 0; i < 100; i++)
        {
            table.AddCell("Col 1 Row 1");
        }
        #endregion
        float[] widths = new float[] { 200f, 200f, 200f, 200f, 100f, 100f, 100f, 100f, 100f, 100f };
        table.SetWidths(widths);
        table.CompleteRow(); //Added - table won't add the final row if its cells are incomplete - safe to have it ending a table
        document.Add(table);
    }
}

您在代码的第一部分中犯的主要错误是引入Document。没必要这样。请阅读第6章 http://manning.com/lowagie2/samplechapter6.pdf我的书,看看C# 示例 http://tinyurl.com/itextsharpIIA2C06.

您在第二部分中犯的主要错误是使用ColumnText意味着您想要控制布局,但不知道如何处理该控件。如果你使用ColumnText,您需要询问专栏是否所有内容都已被消耗。如果没有,您需要自己创建一个新页面。这一切都在第3章 http://tinyurl.com/itextsharpIIA2C03我的书。

第三部分看起来不错(据我对 C# 的理解)。

我写书的目的是为了让人们从一开始就编写正确的代码来节省时间。我的书不是我写的,所以我必须将它们复制/粘贴到 StackOverflow 上;-)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当内容较长时,itextsharp 不会创建新页面 的相关文章

  • 更新面板工作速度非常慢

    我正在编写一个用户可以注册的应用程序 注册时 可以选择多个选项 并根据这些注册字段可见或不可见以及是否必需 我想出了一个想法 所有字段都将位于 updatePanel 中 当用户更改注册选项时 我将在服务器端设置这些字段的可见性 它可以工作
  • 为什么这个 Web api 控制器不并发?

    我有一个 Web API 控制器 里面有以下方法 public string Tester Thread Sleep 2000 return OK 当我调用它 10 次 使用 Fiddler 时 我预计所有 10 次调用都会在大约 2 秒后
  • 在 HKCR 中创建新密钥有效,但不起作用

    我有以下代码 它返回 成功 但使用两种不同的工具使用搜索字符串 3BDAAC43 E734 11D5 93AF 00105A990292 搜索注册表不会产生任何结果 RegistryKey RK Registry ClassesRoot C
  • 在 CPP 类中将 C 函数声明为友元

    我需要在 C 函数中使用类的私有变量 我正在做这样的事情 class Helper private std string name public std getName return name friend extern C void in
  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 前向声明类型和“已声明为类类型的非类类型”

    我对以下代码有问题 template
  • 从复选框列表中选择循环生成的复选框中的一个复选框

    抱歉我的英语不好 在我的 ASP NET 网站上 我从 SQL 表导入软件列表 看起来像这样 但实际上要长得多 Microsoft Application Error Reporting br br Microsoft Applicatio
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • cpp.react库的C++源代码中奇怪的“->* []”表达式

    这是我在文档中找到的 C 片段cpp react 库 https github com schlangster cpp react implicit parallelism auto in D MakeVar 0 auto op1 in g
  • 在 C# 中,如何根据在 gridview 行中单击的按钮引用特定产品记录

    我有一个显示产品网格视图的页面 该表内有一列 其中有一个名为 详细信息 的超链接 我想这样做 以便如果用户单击该特定产品的详细信息单元格 将打开一个新页面 提供有关该产品的更多信息 我不确定如何确定哪个Product记录链接的详细信息以及我
  • 不同 C++ 文件中的相同类名

    如果两个 C 文件具有相同名称的类的不同定义 那么当它们被编译和链接时 即使没有警告也会抛出一些东西 例如 a cc class Student public std string foo return A void foo a Stude
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 在 C 中使用枚举而不是 #defines 作为编译时常量是否合理?

    在 C 工作了一段时间后 我将回到 C 开发领域 我已经意识到 在不必要的时候应该避免使用宏 以便让编译器在编译时为您做更多的工作 因此 对于常量值 在 C 中我将使用静态 const 变量或 C 11 枚举类来实现良好的作用域 在 C 中
  • memcpy/memmove 到联合成员,这是否设置“活动”成员?

    重要说明 一些评论者似乎认为我是从工会抄袭的 仔细看memcpy 它从普通旧地址复制uint32 t 它不包含在联合中 另外 我正在复制 通过memcpy 到工会的特定成员 u a16 or u x in a union 不直接到整个联盟本
  • C++ - 多维数组

    处理多维数组时 是否可以为数组分配两种不同的变量类型 例如你有数组int example i j 有可能吗i and j是两种完全不同的变量类型 例如 int 和 string 听起来您正在寻找 std vector
  • 使动态创建的链接标签在 Winforms 中可点击

    我正在制作一个程序 允许用户单击由动态链接标签创建的公司名称 在我想知道如何做到这一点之前 我从未在 C 中使用过链接标签 可为特定用户生成的业务数量各不相同 因此每个用户的链接标签数量并不相同 然后我想捕获业务 ID 以进行 Json 调
  • 如何解压 msgpack 文件?

    我正在将 msgpack 编码的数据写入文件 在编写时 我只是使用 C API 的 fbuffer 如 我为示例删除了所有错误处理 FILE fp fopen filename ab msgpack packer pk msgpack pa
  • EntityFramework 6.0.0.0 读取数据,但不插入

    我创建了一个基于服务的数据库 folderName gt Add New Item gt Data gt Service based Database文件到 WPF 应用程序中 然后我用过Database First方法并创建了Person
  • 如何在 sql azure 上运行 aspnet_regsql? [复制]

    这个问题在这里已经有答案了 可能的重复 将 ASP NET 成员资格数据库迁移到 SQL Azure https stackoverflow com questions 10140774 migrating asp net membersh
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的

随机推荐

  • 克服 PHP 中的针状大海捞针混乱

    克服 PHP 中的大海捞针混乱的最实用方法是什么 这里 needle 是第一个参数 bool in array mixed needle array haystack bool strict FALSE 这里 needle 是第二个参数 s
  • ImportError:Elastic Beanstalk 中没有名为 django.core.wsgi 的模块

    我刚开始使用AWS 的弹性豆茎 我正在关注这个tutorial https realpython com blog python deploying a django app to aws elastic beanstalk to 部署 D
  • 跨继承模板组合资产资源

    我们正在使用 Symfony2 构建一个新站点 Assetic 在资源管理方面看起来非常有前途 特别是在自动组合和处理所有 js css 文件方面 我们将拥有一些在整个站点范围内使用的资源 以及一些特定于特定页面的资源 我们还将使用三层继承
  • JFreeChart SpiderWebPlot 内圈?

    所以我一直在使用 JFreeChart 尝试创建 SpiderWebPlot 到目前为止它运行良好 我想知道是否可以为可能的值添加圆圈 这样它看起来更像是一个实际的蜘蛛网 如下所示 按照建议here https stackoverflow
  • html5 可以设置制表位吗?

    我想在 html5 中设置制表位并能够将文本与它们对齐 就像在 Word 中一样 对于我的应用程序 我不能使用表格 有没有办法做到这一点 我必须使用 JavaScript 吗 尽管其他发帖者的主张与此相反 但有充分的理由想要按照OP的要求做
  • OpenCV - 将相机矩阵和畸变系数存储为 Mat

    我使用示例 OpenCV 程序计算相机矩阵和畸变系数 并生成包含相关数据的 xml 文件 我正在尝试通过使用它undistort函数 但我不确定如何将值存储为Mat Mat cameraMatrix Mat distortionCoeffi
  • 非线程安全 Singleton 中的部分构造对象

    在多线程环境中 线程怎么可能看到 部分构造的对象 我知道它不是线程安全的 因为多个线程可以创建多个实例 class LazyInit private static Resource resource null public static g
  • 如何在 Bootstrap 3 中创建响应式按钮?

    我尝试在 768px 屏幕上显示 btn sm 但它一直显示 btn xs 这是我的 HTML 代码 div class col md 6 col sm 6 col xs 12 col md offset 3 col sm offset 3
  • 如何在ggplot中命名图例中的数据? [复制]

    这个问题在这里已经有答案了 我有数据框One APD One APD structure list Amplification c 108 91 120 765 134 875 151 877 172 812 199 324 Voltage
  • Silverlight:在 XAML 中声明数据集合?

    我想在我的 Silverlight for Windows Phone 7 应用程序中声明一些数据 我不确定语法是什么 例如 public class Person public string Name get set public int
  • 如何在使用流读取文件时保留换行符 - java 8

    try Stream
  • 生成 M 个箱中 N 个球的所有排列

    我想生成一组排列n球进m垃圾箱 以下一组嵌套列表生成这些排列 n lt 3 m lt 4 v lt rep 0 m for i in n 0 for j in n sum i 0 for k in n sum i j 0 for l in
  • 敲除 javascript foreach 绑定

    我试图允许用户创建一个铸造并向该铸造对象添加一组类别 我试图使用淘汰赛的 foreach 绑定到类别数组 并让用户向铸造添加新类别 我创建了一个 jsfiddle 来说明我在这里试图解释的内容 http jsfiddle net msell
  • Ruby 中的大指数?

    我只是在做一些与大学相关的 Diffie Hellman 练习 并尝试使用 ruby 遗憾的是 Ruby 似乎无法处理大指数 警告 在 a b 中 b 可能太大 NaN 有什么办法解决吗 例如 特殊的数学课或类似的课程 附注这是有问题的代码
  • 获取 Azure 队列中的消息 ID

    有没有办法在将消息插入队列Azure后获取消息ID CloudStorageAccount storageAccount CloudStorageAccount parse storageConnectionString CloudQueu
  • 我可以克隆未来吗?

    我想为未来编写一些通用的重试逻辑 我知道具体的返回类型 并且想在未来重试相同的操作 我的代码只能访问未来 我不想将每个 fn 调用站点包装在闭包中以启用重新创建它 似乎 未来 是 fn args 的组合 并且当 await被调用后 它会运行
  • 如何解决“无法读取 null 的属性‘appendChild’”错误?

    我尝试使用下面的代码 它在我的网站上的幻灯片中添加按钮 window onload function loadContIcons var elem document createElement img elem src http arno
  • Django 模板看不到 CSS 文件

    我正在构建一个 django 应用程序 但无法获取模板来查看 CSS 文件 我的 settings py 文件如下所示 MEDIA ROOT os path join os path abspath os path dirname file
  • Spring Boot未加载application.dev.properties文件

    在我的项目中 我想使用环境特定的属性文件 例如 如果我将其运行到开发中 它应该使用 application dev properties 对于生产它应该使用 application prod properties 等等 我的资源文件夹中有以
  • 当内容较长时,itextsharp 不会创建新页面

    我尝试从 3 天开始寻找制作一份 pdf 文档的方法 如果有任何帮助 我将不胜感激 我有几个表单字段可以毫无问题地访问和填写 我想在此字段下方放置动态创建的表 该表可以足够长 可以包含多个页面 这是我的问题 我无法将此表添加到其下方带有表单