2013-10-24 2 views
1

Как преобразовать XML в PDF с помощью iTextSharp? Современный XML-файл iTextSharp явно устарел и не работает. Поэтому я решил исправить проблему, но я не смог ее скрывать. Может ли кто-нибудь мне помочь.Как преобразовать XML в PDF с помощью iTextSharp?

<?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> 
+0

Это довольно противный API (или, по крайней мере, это было 5 лет назад). Я использовал его несколько лет назад в университете. Когда я вернусь домой, попытаюсь выкопать образцы кода. Если вы достаточно сильно работаете с Google, вы сможете найти несколько примеров, которые вы можете собрать вместе. Это определенно там. – Goober

+0

@Goober спасибо. Но не так много элементов и атрибутов, где я могу преобразовать XML в правильный формат таблицы, как мы можем обойтись без использования Xml, где мы можем просто создать структуру таблицы и добавить к ней данные, в которых мы хотим всегда. –

+0

Я не совсем уверен, что вы имеете в виду. По сути вам нужно хорошее понимание XML для выполнения этой задачи. – Goober

ответ

2

Это действительно тривиально делать самостоятельно. Вы не указали язык, поэтому в примере ниже используется 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(); 
      } 
     } 
    } 
} 
+0

thanks.I использую C#, поэтому я думаю, что мне нужен код в C#. У меня есть одно сомнение: в моем случае статические поля остаются неизменными во время генерации pdf, только данные (такие как test no, Unit, Is code будут динамически прикрепленные к этим статическим полям или ярлыкам, так как я должен продолжать добавлять новую страницу, так как данные, которые у меня есть в моем XMl, очень большие, и для создания отчета потребуется несколько страниц PDF. Таким образом, определенная таблица должна оставаться неизменной данные должны быть должным образом привязаны к определенным ярлыкам или полям. –

+0

спасибо за обмен версией C#. Мне нужно сделать много изменений, потому что мой заголовок находится в вертикальном формате, а столбцы не должны превышать более 6 на страницу после объявления заголовка Спасибо, Крис. –

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