2016-12-27 6 views
0

Наконец получил это работаетiTextSharp добавить (стиль CSS или файл CSS) и скачать PDF-файл

var inputString = @"<html> 
<body> 
<table class='table-bordered'> 
    <thead> 
     <tr> 
      <th>Customer Name</th> 
      <th>Customer's Address</th> 
     </tr> 
    </thead> 
<tbody> 
    <tr> 
     <td> XYZ </td> 
     <td> Bhubaneswar </td> 
    </tr> 
    <tr> 
     <td> MNP </td> 
     <td> Cuttack </td> 
    </tr> 
</tbody> 
</table> 
</body> 
</html>"; 


List<string> cssFiles = new List<string>(); 
cssFiles.Add(@"/Content/bootstrap.css"); 

var output = new MemoryStream(); 

var input = new MemoryStream(Encoding.UTF8.GetBytes(inputString)); 

var document = new Document(); 
var writer = PdfWriter.GetInstance(document, output); 
writer.CloseStream = false; 

document.Open(); 
var htmlContext = new HtmlPipelineContext(null); 
htmlContext.SetTagFactory(iTextSharp.tool.xml.html.Tags.GetHtmlTagProcessorFactory()); 

ICSSResolver cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(false); 
cssFiles.ForEach(i => cssResolver.AddCssFile(System.Web.HttpContext.Current.Server.MapPath(i), true)); 

var pipeline = new CssResolverPipeline(cssResolver, new HtmlPipeline(htmlContext, new PdfWriterPipeline(document, writer))); 
var worker = new XMLWorker(pipeline, true); 
var p = new XMLParser(worker); 
p.Parse(input); 
document.Close(); 
output.Position = 0; 


Response.Clear(); 
Response.ContentType = "application/pdf"; 
Response.AddHeader("Content-Disposition", "attachment; filename=myfile.pdf"); 
Response.BinaryWrite(output.ToArray()); 
// myMemoryStream.WriteTo(Response.OutputStream); //works too 
Response.Flush(); 
Response.Close(); 
Response.End(); 
+0

@AnupSharma Я хочу уменьшить размер шрифта стола внутри. –

+1

'HTMLWorker' был оставлен в пользу XML Worker. 'HTMLWorker' не поддерживает CSS (и никогда не будет поддерживать CSS, поскольку его использование было прекращено). Узнайте больше о [XML Worker] (http://developers.itextpdf.com/faq/category/parsing-xml-and-xhtml) на официальном сайте iText. –

+0

@BrunoLowagie Я уже прошел этот вопрос. Не удалось решить мою проблему. –

ответ

1

Как вы обнаружили себя, главная проблема, которую вы испытали была вызвана подачей недопустимый HTML в XML Worker. Я написал пример Java, что эквивалентно вашей (обновлено) C# пример:

public static final String CSS = "th { background-color: #C0C0C0; font-size: 16pt; } " 
    + "td { font-size: 10pt; }"; 
public static final String HTML = "<html><body><table class='table-bordered'>" 
    + "<thead><tr><th>Customer Name</th><th>Customer's Address</th> </tr></thead>" 
    + "<tbody><tr><td> XYZ </td><td> Bhubaneswar </td></tr>" 
    + "<tr><td> MNP </td><td> Cuttack </td></tr></tbody>" 
    + "</table></body></html>"; 

/** 
* @param file 
* @throws IOException 
* @throws DocumentException 
*/ 
public void createPdf(String file) throws IOException, DocumentException { 
    Document document = new Document(); 
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(file)); 
    document.open(); 


    CSSResolver cssResolver = new StyleAttrCSSResolver(); 
    CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(CSS.getBytes())); 
    cssResolver.addCss(cssFile); 

    // HTML 
    HtmlPipelineContext htmlContext = new HtmlPipelineContext(null); 
    htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory()); 

    // Pipelines 
    PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer); 
    HtmlPipeline html = new HtmlPipeline(htmlContext, pdf); 
    CssResolverPipeline css = new CssResolverPipeline(cssResolver, html); 

    // XML Worker 
    XMLWorker worker = new XMLWorker(css, true); 
    XMLParser p = new XMLParser(worker); 
    p.parse(new ByteArrayInputStream(HTML.getBytes())); 
    document.close(); 
} 

Полученная таблица выглядит следующим образом:

enter image description here

Вы можете настроить значения, хранящиеся в CSS для создания более приятный внешний вид для стола.

+0

@Brunno Lowagie Спасибо –

+0

@Bruno Я не видел новый метод ByteArrayInputStream (HTML.getBytes()). что он делает? – Selman

+0

«ByteArrayInputStream» - стандартный Java-класс в JDK. Это реализация 'InputStream', которая принимает' byte [] ', и это позволяет использовать его как' InputStream'. В этом нет ничего особенного. Это просто Java. Кстати: если вы хотите конвертировать HTML в PDF, прочитайте [Преобразование HTML в PDF с помощью iText] (https://stackoverflow.com/questions/47895935/converting-html-to-pdf-using-itext) прежде чем вы начнете писать код. –

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