如何使用 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 中不可能完成的事情。
存在三种可能的解决方法,其中两种不是有效的选项:
- 使用带有嵌入式
.swf
组件的 RichMedia 注释。在此解决方法中,您不在 PDF 中创建 table,而是在 Flex/Flash 中可视化 table。此解决方法不是有效选项,因为 (1) 此功能已弃用(它不会出现在 ISO-32000-2 中),(2) 对 Flash 组件的支持非常少,(3) 甚至 Adobe 也放弃了 Flash .
- 创建实际上是 XFA 表单的 PDF。使用 JavaScript 更改 table。这不能使用 iText(Sharp) 完成,这不是一个有效的选项,因为 (1) XFA 将在 ISO-32000-2 中被弃用,(2) 许多 PDF 查看器不支持 XFA 和 (3) Adobe已告知全世界他们永远不会在移动设备上支持 XFA。
- 添加 table 的次数与同一坐标处的列数相同。将可选内容用于 hide/show 特定的 table。使 header 中的单元格可点击,并使用 JavaScript 触发一个动作,使一个特定的 table 可见而所有其他 table 不可见。警告:不支持 PDF 1.5 的 PDF 查看器将同时显示所有 table。幸运的是,那些 stone-age PDF 查看器已经不多了。
基本上,归结为:
- 告诉您的雇主,他要问的问题在 PDF 中是不可能的。如果他不相信你,就说你不会做,直到他给你看一个符合他要求的 PDF 示例。
- 使用涉及 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 中找到此类注释的示例。
我正在使用 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 中不可能完成的事情。
存在三种可能的解决方法,其中两种不是有效的选项:
- 使用带有嵌入式
.swf
组件的 RichMedia 注释。在此解决方法中,您不在 PDF 中创建 table,而是在 Flex/Flash 中可视化 table。此解决方法不是有效选项,因为 (1) 此功能已弃用(它不会出现在 ISO-32000-2 中),(2) 对 Flash 组件的支持非常少,(3) 甚至 Adobe 也放弃了 Flash . - 创建实际上是 XFA 表单的 PDF。使用 JavaScript 更改 table。这不能使用 iText(Sharp) 完成,这不是一个有效的选项,因为 (1) XFA 将在 ISO-32000-2 中被弃用,(2) 许多 PDF 查看器不支持 XFA 和 (3) Adobe已告知全世界他们永远不会在移动设备上支持 XFA。
- 添加 table 的次数与同一坐标处的列数相同。将可选内容用于 hide/show 特定的 table。使 header 中的单元格可点击,并使用 JavaScript 触发一个动作,使一个特定的 table 可见而所有其他 table 不可见。警告:不支持 PDF 1.5 的 PDF 查看器将同时显示所有 table。幸运的是,那些 stone-age PDF 查看器已经不多了。
基本上,归结为:
- 告诉您的雇主,他要问的问题在 PDF 中是不可能的。如果他不相信你,就说你不会做,直到他给你看一个符合他要求的 PDF 示例。
- 使用涉及 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 中找到此类注释的示例。