2016-02-12 1 views
0

Я создаю таблицу в PDF с помощью iTextsharp. Я хочу сортировать таблицу по ее столбцам.Как отсортировать таблицу в pdf с помощью itextsharp

This is my output table.

Когда я нажимаю на первый столбец, он должен сортироваться в алфавитном порядке, второй столбец должен сортировать по дате по порядку (по возрастанию), а третий/четвертый столбцы должны сортироваться в порядке номеров (по возрастанию). Вот мой код:

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; 
    } 

Я не знаю, как это реализовать.

+1

Обычно * итерационные данные * (список, таблица, файл и т. Д.) Обрабатываются в цикле ('for',' foreach', 'while' и т. Д.). Затем сортировка данных перед выводом - это то, что вы хотите (и ее легко сортировать, например, «Список <>»). В настоящее время вы выводите данные вручную, и они будут отображаться в этом точном порядке и для их сортировки вам нужно сортировать строки в исходном файле. – Sinatr

+1

Как сказал @Sinatr, возможно, вы должны отсортировать данные перед созданием таблицы. С другой стороны, возможна ли динамическая сортировка pdf-таблицы без каких-либо дыма и зеркал? (Создание скрытых страниц со всеми возможными сортировками, а затем гиперсвязь из столбцов таблицы на такие страницы) – ARdC

ответ

1

Вы пытаетесь сделать что-то невозможное в PDF.

Есть три возможных решения, два из которых не являются действительными варианты:

  1. Используйте RichMedia аннотацию со встроенным .swf компонентом. В этом обходном пути вы не создаете таблицу в формате PDF, но визуализируете таблицу в Flex/Flash. Это обходное решение не является допустимым вариантом, потому что (1) эта функциональность устарела (она не будет в ISO-32000-2), (2) поддержка Flash-компонентов очень мало, (3) даже Adobe отказалась от Flash ,
  2. Создайте PDF-файл, который на самом деле является формой XFA. Измените таблицу с помощью JavaScript. Это невозможно сделать с помощью iText (Sharp), и это не является допустимым вариантом, потому что (1) XFA будет устаревшим в ISO-32000-2, (2) многие просмотры PDF не поддерживают XFA и (3) Adobe сообщил миру, что они никогда не будут поддерживать XFA на мобильных устройствах.
  3. Добавьте таблицу столько раз, сколько есть столбцов с одинаковыми координатами. Используйте дополнительный контент, чтобы скрыть/показать определенные таблицы. Сделайте ячейки в заголовке кликабельными и используйте JavaScript, чтобы вызвать действие, которое делает одну конкретную таблицу видимой, а все остальные таблицы невидимы. Предостережение: просмотрщики PDF, которые не поддерживают PDF 1.5, будут отображать все таблицы одновременно. К счастью, таких читателей в стиле каменного века не так много.

В основном, это сводится к следующему:

  1. Расскажите своему работодателю, что он что-то, что невозможно в формате PDF с просьбой. Если он вам не поверит, скажите, что вы ничего не сделаете, пока не покажет вам пример PDF, который бы соответствовал его требованиям.
  2. Используйте обходное решение, которое включает OCG. Начните с рассмотрения различных примеров, которые включают optional content groups. Если вы не понимаете моего ответа, пожалуйста, не оставляйте комментарий «дайте мне пример, пожалуйста», но адаптируйте свой код и опубликуйте новый вопрос, объясняющий, что вы не понимаете в OCG. Посмотрев на свою выходную таблицу, я вижу, что вы читали мою книгу «iText in Action - Second Edition» (вы используете один из моих примеров). OCG объясняется в главе 15 этой книги.

Обновление: Образец отправлен на мой адрес электронной почты. Я не знаю, разрешено ли это StackOverflow, но учтите, что я этого не допускаю. Я отвечаю на вопросы StackOverflow на добровольной основе, но Я не отвечаю на вопросы бесплатно, которые отправляются на мой личный адрес электронной почты.

Письмо, отправленное мне, содержало документ PDF, который отличался от того, что было описано в вопросе. Этот документ PDF состоит из 5 страниц. Каждая страница имеет заголовок, который выглядит как последовательность из пяти вкладок.В дополнение к этим визуальным вкладкам добавляется аннотация. Нажатие на такую ​​аннотацию вызывает действие «локальное Goto». Примеры таких аннотаций можно найти в chapter 7 официальной документации.

+0

Это мы обнаружили на сайте Заказчика. Образец прилагается. Пожалуйста, взгляните на него, чтобы уточнить, может ли это быть адрес с iText. –

+0

Образец прилагается? Где он прикреплен? –

+0

* PDF-документ, который отличается от того, что было описано в вопросе * - описание звучит так, как будто PDF может * отображаться * делать то, что описано в вопросе, по крайней мере в глазах * нетехника *. Любой * разработчик *, с другой стороны, попросил создать что-то подобное, должно было признать трюк за то, что это такое. – mkl

Смежные вопросы