Авторазрывные PdfTable ячейки PdfFileWriter c#

#c# #sqlite #pdf #pdftables

Вопрос:

Я пишу программу, которая извлекает данные Cutomer из файла SQLite и сохраняет их в PDF-файле в формате PDF, например:

 PdfContents contentsTable = new PdfContents(page);  PdfTable table = new PdfTable(page, contentsTable, ArialNormal, fontSize); table.TableArea = new PdfRectangle(border (2 * border   fontHight), (210 - border), (297 - (2 * border   4 * linespacing   5 * fontHight))); // lt;- 'border', 'fontHight' and 'linespacing' are simply variables i use to define lengths that also apear at other locations table.SetColumnWidth(30, 75, 35, 10, 30, 22, 8); table.HeaderOnEachPage = true; table.MinRowHight = 5; table.Header[0].Style = table.HeaderStyle; table.Header[1].Style = table.HeaderStyle; table.Header[2].Style = table.HeaderStyle; table.Header[3].Style = table.HeaderStyle; table.Header[4].Style = table.HeaderStyle; table.Header[5].Style = table.HeaderStyle; table.Header[6].Style = table.HeaderStyle; table.Header[0].Value = "CODE"; table.Header[1].Value = "BESCHREIBUNG"; table.Header[2].Value = "MATERIALNAME"; table.Header[3].Value = "NoFl"; table.Header[4].Value = "ERGEBNIST"; table.Header[5].Value = "BEWERTUNG"; table.Header[6].Value = "ART";  // Querys the 'ANALYT' and 'RESULTS' Table and Adds the Answers into the Table in the PDF-File using (var connection = new SQLiteConnection("Data Source = "   dbFile)) // lt;- 'dbFile' contains the Path to the File { // Opens the connection to the SQLite File connection.Open(); var command = connection.CreateCommand(); command.CommandText = "select A.CODE, A.BESCHERIBUNG, A.MATERIALNAME, R.NORMFLAG, R.ERGEBNIST, R.BEWERTUNG, R.ART "   "from ANALYT A, RESULTS R "   "and A.ANALYTX = R.ANALYTX "   "order by A.MATERIALNAME desc, R.SORT ";  using (var reader = command.ExecuteReader()) { if (reader.HasRows) { while (reader.Read()) { table.Cell[0].Value = reader[0].ToString(); table.Cell[1].Value = reader[1].ToString(); table.Cell[2].Value = reader[2].ToString(); table.Cell[3].Value = reader[3].ToString(); table.Cell[4].Value = reader[4].ToString(); table.Cell[5].Value = reader[5].ToString(); table.Cell[6].Value = reader[6].ToString(); } contentToBeAdded = true; // lt;- A variable i use to determine if the processes are all successfull } else { // Code that lets the user know something went wrong } connection.Close(); } table.Close(); document.CreateFile();  

Этот код прекрасно работает практически при любых обстоятельствах, но, поскольку данные в базе данных были собраны сотнями людей на протяжении десятилетий, значения данных могут иметь широкий диапазон длины. В то время как значения ширины, которые я ввел, адекватны для большинства ситуаций, могут быть определенные укоренения, которые намного длиннее. Поскольку данные, с которыми я работаю, довольно важны, я не могу просто игнорировать эти несколько случаев. Моя первоначальная мысль заключалась в том, что PdfTable автоматически добавит новую строку и сделает ячейку выше. Но когда я столкнулся именно с этой проблемой в своем тестировании, я заметил, что текст просто продолжал идти и покрывал следующую ячейку. Есть ли простое решение, которое я могу указать PdfTable, чтобы сделать это автоматически, или мне нужно подсчитать количество букв в строке и разделить их по отдельности для каждого значения, которое должно быть длинным? Поскольку я все еще довольно новичок в программировании, я очень признателен за любую помощь и вклад.

Ответ №1:

Я нашел решение своего вопроса, и оно на самом деле довольно простое. Я надеюсь, что в будущем у кого-то может возникнуть та же проблема и он сочтет это полезным.

Вместо добавления простой строки используйте PdfFileWriter.TextBox , например:

 PdfFileWriter.TextBox textBox0 = new PdfFileWriter.TextBox(16, 0, 0.5); // lt;- 16 = TextboxWidth, 0 = FirstLineIndent, 0.5 = LineBreakFactor  textBox0.AddText(ArialNormal, fontSize, reader0); // lt;- ArialNormal = PdfFont Variable containing a Font, fontSize = int Variable containing the Font Size, reader0 = string Variable containing the Content  table.Cell[0].Value = textBox0;  

Это добавит Text AutoLineBreak и увеличит Height размер ячейки.

Надеюсь, кто-нибудь сочтет это полезным.