2012-09-26 3 views
1

En utilisant le code suivant ASP.net/iTextSharp pour analyser le contenu d'un fichier HTML en PDF et jeter dans le flux de réponse:iTextSharp XMLWorkerHelper HTML au format PDF Tableau Alignement

Response.Clear(); 
Response.ContentType = "application/pdf"; 
using (Document doc = new Document()) 
{ 
    PdfWriter writer = PdfWriter.GetInstance(doc, Response.OutputStream); 
    doc.Open(); 
    using (TextReader reader = File.OpenText(Server.MapPath("~/Test.htm"))) 
    { 
     XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, reader); 
    } 
    doc.Close(); 
} 
Response.End(); 

Cela fonctionne, mais le Le fichier PDF résultant n'a pas le même style que la page HTML d'origine. Pour commencer, l'analyseur css intégré ne semble pouvoir fonctionner qu'avec des styles et des classes d'étiquettes directes (pas de chaînage comme: thead th { background-color:#999; }). Deuxièmement, il semble que les frontières soient une affaire de tout ou rien. Il n'a pas de concept de border-top, border-bottom, etc, et border-collapse ne réduit pas les frontières des cellules adjacentes, donc les frontières finissent par être deux fois plus épaisses que je le veux. Enfin, je n'arrive pas à comprendre comment aligner une table sur le côté gauche ou droit du document. C'est toujours centré. J'ai essayé d'emballer dans un div avec text-align, j'ai essayé de régler l'attribut align, j'ai essayé de régler text-align directement sur la table. Vous n'arrivez pas à comprendre ça?

Voici mon document de démonstration que je suis en train d'utiliser comme preuve de concept:

<!DOCTYPE html> 
<html> 
<head> 
    <title>This is the title</title> 
    <meta name="description" content="This is the description" /> 
    <meta name="keywords" content="abc, 123, xyz" /> 
    <style type="text/css"> 
     body { font-family:Arial, Verdana, Sans-Serif; font-size:9pt; } 
     .dataGrid { font-family:Arial, Verdana, Sans-Serif; font-size:9pt; border-collapse: collapse; border:1px solid #000; width:80%; margin:0; text-align:left; } 
     th { padding:3px 4px; font-weight:bold; border:1px solid #000; } 
     td { padding:3px 4px; border:1px solid #000; } 
     .head { border-bottom:2px solid #000; background-color:#9BBA1F; font-weight:bold; } 
     .odd { background-color:#fff; } 
     .even { background-color:#D6EB87; } 
     .foot { border-top:2px solid #000; background-color:#BAB0C4; font-weight:bold; } 
     h1 { font-size:14pt; color:#FFA200; text-align:center; } 
     .right { text-align:right; } 
     .center { text-align:center; } 
     .left { text-align:left; } 
    </style> 
</head> 
<body> 
    <h1>Sample Document</h1> 

    <div style="text-align:left;"> 
    <table class="dataGrid" align="left"> 
     <thead> 
      <tr class="head"> 
       <th width="70%">Name</th> 
       <th width="15%" class="center">Qty</th> 
       <th width="15%" class="center">Price</th> 
      </tr> 
     </thead> 
     <tbody> 
      <tr class="odd"> 
       <td>ABC</td> 
       <td class="center">2</td> 
       <td class="right">$5.00</td> 
      </tr> 
      <tr class="even"> 
       <td>XYZ</td> 
       <td class="center">1</td> 
       <td class="right">$10.00</td> 
      </tr> 
      <tr class="odd"> 
       <td>123</td> 
       <td class="center">3</td> 
       <td class="right">$2.00</td> 
      </tr> 
      <tr class="even"> 
       <td>789</td> 
       <td class="center">1</td> 
       <td class="right">$4.00</td> 
      </tr> 
     </tbody> 
     <tfoot> 
      <tr class="foot"> 
       <td class="right">Totals</td> 
       <td class="center">7</td> 
       <td class="right">$30.00</td> 
      </tr> 
     </tfoot> 
    </table> 
    </div> 
</body> 
</html> 

Répondre

1

Après avoir passé un tas de temps sur ce que je ne pouvais pas le faire fonctionner correctement. En tant que tel, j'ai fini par passer à un autre outil: wkHtmlToPdf. J'ai utilisé la classe d'emballage Codaxy disponible dans Nuget pour aider à créer les appels, et je vois des résultats bien meilleurs que ce que j'ai vu avec iTextSharp. Il comprend principalement des sélecteurs CSS, et gère automatiquement des choses comme des images et des liens.

Questions connexes