Это действительно тривиально делать самостоятельно. Вы не указали язык, поэтому в примере ниже используется VB.Net, поскольку (я думаю) он обрабатывает XML более легко. Дополнительную информацию см. В комментариях к коду. Это нацелено на iTextSharp 5.4.4, но должно работать практически с любой версией.
''//Sample XML
Dim TextXML = <?xml version="1.0" encoding="utf-8"?>
<catalog>
<cd>
<SR.No>14</SR.No>
<test>loss test</test>
<code>ISO-133</code>
<unit>gm</unit>
<sampleid>36</sampleid>
<boreholeid>21</boreholeid>
<pieceno>63</pieceno>
</cd>
<cd>
<SR.No>24</SR.No>
<test>sand</test>
<code>ISO-133</code>
<unit>gm</unit>
<sampleid>71</sampleid>
<boreholeid>22</boreholeid>
<pieceno>23</pieceno>
</cd>
<cd>
<SR.No>25</SR.No>
<test>clay</test>
<code>ISO-133</code>
<unit>mg</unit>
<sampleid>52</sampleid>
<boreholeid>21</boreholeid>
<pieceno>36</pieceno>
</cd>
</catalog>
''//File to write to
Dim TestFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf")
''//Standard PDF creation, nothing special here
Using fs As New FileStream(TestFile, FileMode.Create, FileAccess.Write, FileShare.None)
Using doc As New Document()
Using writer = PdfWriter.GetInstance(doc, fs)
doc.Open()
''//Create a table with one column for every child node of <cd>
Dim T As New PdfPTable(TextXML.<catalog>.<cd>.First.Nodes.Count)
''//Loop through the first item to output column headers
For Each N In TextXML.<catalog>.<cd>.First.Elements
T.AddCell(N.Name.ToString())
Next
''//Loop through each CD row (this is so we can call complete later on)
For Each CD In TextXML.<catalog>.Elements
''//Loop through each child of the current CD
For Each N In CD.Elements
T.AddCell(N.Value)
Next
''//Just in case any rows have too few cells fill in any blanks
T.CompleteRow()
Next
''//Add the table to the document
doc.Add(T)
doc.Close()
End Using
End Using
End Using
EDIT
Вот C# версии. Я включил вспомогательный метод для создания большого XML-документа на основе вашего шаблона, чтобы показать переполнение страницы. PdfPTable
будет автоматически спамить несколько страниц. Вы можете указать количество строк, которые должны считаться «заголовком», чтобы они повторялись на последующих страницах. Вы, вероятно, захотите также применить некоторые правила форматирования, но вы должны быть в состоянии найти эти онлайн (ищите PdfPTable.DefaultCell
)
private XDocument createXml() {
//Create our sample XML document
var xml = new XDocument(new XDeclaration("1.0", "utf-8", "yes"));
//Add our root node
var root = new XElement("catalog");
//All child nodes
var nodeNames = new[] { "SR.No", "test", "code", "unit", "sampleid", "boreholeid", "pieceno" };
XElement cd;
//Create a bunch of <cd> items
for (var i = 0; i < 1000; i++) {
cd = new XElement("cd");
foreach (var nn in nodeNames) {
cd.Add(new XElement(nn) { Value = String.Format("{0}:{1}", nn, i.ToString()) });
}
root.Add(cd);
}
xml.Add(root);
return xml;
}
private void doWork() {
//Sample XML
var xml = createXml();
//File to write to
var testFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.pdf");
//Standard PDF creation, nothing special here
using (var fs = new FileStream(testFile, FileMode.Create, FileAccess.Write, FileShare.None)) {
using (var doc = new Document()) {
using (var writer = PdfWriter.GetInstance(doc, fs)) {
doc.Open();
//Count the columns
var columnCount = xml.Root.Elements("cd").First().Nodes().Count();
//Create a table with one column for every child node of <cd>
var t = new PdfPTable(columnCount);
//Flag that the first row should be repeated on each page break
t.HeaderRows = 1;
//Loop through the first item to output column headers
foreach (var N in xml.Root.Elements("cd").First().Elements()) {
t.AddCell(N.Name.ToString());
}
//Loop through each CD row (this is so we can call complete later on)
foreach (var CD in xml.Root.Elements()) {
//Loop through each child of the current CD. Limit the number of children to our initial count just in case there are extra nodes.
foreach (var N in CD.Elements().Take(columnCount)) {
t.AddCell(N.Value);
}
//Just in case any rows have too few cells fill in any blanks
t.CompleteRow();
}
//Add the table to the document
doc.Add(t);
doc.Close();
}
}
}
}
Это довольно противный API (или, по крайней мере, это было 5 лет назад). Я использовал его несколько лет назад в университете. Когда я вернусь домой, попытаюсь выкопать образцы кода. Если вы достаточно сильно работаете с Google, вы сможете найти несколько примеров, которые вы можете собрать вместе. Это определенно там. – Goober
@Goober спасибо. Но не так много элементов и атрибутов, где я могу преобразовать XML в правильный формат таблицы, как мы можем обойтись без использования Xml, где мы можем просто создать структуру таблицы и добавить к ней данные, в которых мы хотим всегда. –
Я не совсем уверен, что вы имеете в виду. По сути вам нужно хорошее понимание XML для выполнения этой задачи. – Goober