Ячейки таблицы Pdf с автоматическим разбиением на линии PdfFileWriter c#
Я пишу программу, которая извлекает данные Cutomer из файла SQLite и сохраняет их в файле PDF в таблице PdfTable, например:
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))); // <- '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)) // <- '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; // <- 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); // <- 16 = TextboxWidth, 0 = FirstLineIndent, 0.5 = LineBreakFactor
textBox0.AddText(ArialNormal, fontSize, reader0); // <- 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
ячейки.
Надеюсь, кто-нибудь сочтет это полезным.