如何使用 itextsharp 对 pdf 中的 table 进行排序

How to sort a table in a pdf using itextsharp

我正在使用 iTextsharp 在 PDF 中创建 table。我想按列对 table 进行排序。

.

当我点击第一列时,它必须按字母顺序排序,第二列必须按日期顺序排序(升序),Third/fourth 列必须按数字顺序排序(升序)。这是我的代码:

    public void createPdf(string filestream)
    {

        FileStream outputStream = new FileStream(filestream,      FileMode.Create,FileAccess.Write); 
        Document document = new Document(PageSize.A4);
        PdfWriter writer = PdfWriter.GetInstance(document, outputStream);
        document.Open();
        PdfPTable table = createtable();
        document.Add(table);
        document.Close();

    }

    public PdfPTable createtable()
    {
        PdfPTable table = new PdfPTable(4);

        float[] widths = new float[] { 2f, 1f,1f, 1f};
        table.SetTotalWidth(widths);

        PdfPCell cell;
        //First Row
        cell = new PdfPCell(new Phrase("Title"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("Date"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("Time"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("Year"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        //Second Row
        cell = new PdfPCell(new Phrase("The Counterfeiters"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("01/01/2007"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("09:30"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("2007"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        //Third Row
        cell = new PdfPCell(new Phrase("Requiem for a Dream"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("02/01/2000"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("11:30"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("2000"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        //Fourth Row
        cell = new PdfPCell(new Phrase("Cinema Paradiso"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("12/01/1988"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("20:00"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("1988"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        //Fifth Row
        cell = new PdfPCell(new Phrase("About Last Night"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("15/10/1986"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("27:00"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("1986"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        //Sixth Row
        cell = new PdfPCell(new Phrase("Sixteen Candles"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("11/09/1984"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("22:30"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        cell = new PdfPCell(new Phrase("1984"));
        cell.HorizontalAlignment = Element.ALIGN_CENTER;
        table.AddCell(cell);

        return table;
    }

我不知道如何实现它。

您正在尝试做一些在 PDF 中不可能完成的事情。

存在三种可能的解决方法,其中两种不是有效的选项:

  1. 使用带有嵌入式 .swf 组件的 RichMedia 注释。在此解决方法中,您不在 PDF 中创建 table,而是在 Flex/Flash 中可视化 table。此解决方法不是有效选项,因为 (1) 此功能已弃用(它不会出现在 ISO-32000-2 中),(2) 对 Flash 组件的支持非常少,(3) 甚至 Adob​​e 也放弃了 Flash .
  2. 创建实际上是 XFA 表单的 PDF。使用 JavaScript 更改 table。这不能使用 iText(Sharp) 完成,这不是一个有效的选项,因为 (1) XFA 将在 ISO-32000-2 中被弃用,(2) 许多 PDF 查看器不支持 XFA 和 (3) Adob​​e已告知全世界他们永远不会在移动设备上支持 XFA。
  3. 添加 table 的次数与同一坐标处的列数相同。将可选内容用于 hide/show 特定的 table。使 header 中的单元格可点击,并使用 JavaScript 触发一个动作,使一个特定的 table 可见而所有其他 table 不可见。警告:不支持 PDF 1.5 的 PDF 查看器将同时显示所有 table。幸运的是,那些 stone-age PDF 查看器已经不多了。

基本上,归结为:

  1. 告诉您的雇主,他要问的问题在 PDF 中是不可能的。如果他不相信你,就说你不会做,直到他给你看一个符合他要求的 PDF 示例。
  2. 使用涉及 OCG 的解决方法。首先查看涉及 optional content groups 的不同示例。如果您不理解我的回答,请不要 post 发表评论 "give me an example please",而是调整您的代码和 post 一个新问题来解释您不理解的内容OCG。查看您的输出 table,我发现您一直在阅读我的书 "iText in Action - Second Edition"(您正在使用我的示例之一)。 OCG在那本书的第15章有解释。

更新:样本已发送到我的个人邮件地址。我不知道 Whosebug 是否允许这样做,但请注意我不允许这样做。我在 Whosebug 上自愿回答问题,但 我不会免费回答发送到我个人 e-mail 地址的问题。

发送给我的邮件包含一个 PDF 文档,与问题中描述的不同。该 PDF 文档包含 5 页。每个页面都有一个 header,看起来像五个选项卡的序列。在这些可视化选项卡之上,添加了注释。单击此类注释会触发 "local Goto" 操作。可以在官方文档的 chapter 7 中找到此类注释的示例。