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();

person Arun Prasad E S    schedule 27.12.2016    source источник
comment
@AnupSharma Я хочу уменьшить размер шрифта таблицы внутри.   -  person Arun Prasad E S    schedule 27.12.2016
comment
HTMLWorker был заброшен в пользу XML Worker. HTMLWorker не поддерживает CSS (и никогда не будет поддерживать CSS, поскольку его использование прекращено). Узнайте больше о XML Worker на официальном сайте iText.   -  person Bruno Lowagie    schedule 27.12.2016
comment
@BrunoLowagie Я уже ответил на этот вопрос. Не удалось решить мою проблему.   -  person Arun Prasad E S    schedule 27.12.2016
comment
Вы можете использовать: - статический шрифт FontSubHeading = FontFactory.GetFont(gothic, 10, Font.NORMAL, new BaseColor(System.Drawing.ColorTranslator.FromHtml(#404041).ToArgb())); Параграф DearName = новый абзац (тест, FontSubHeading); документ.Добавить(УважаемоеИмя);   -  person Anand Systematix    schedule 27.12.2016
comment
Вы не показываете свой HTML + CSS, поэтому невозможно ответить на ваш вопрос. См., например, Как преобразовать таблицу HTML в PDF? где у вас есть HTML, CSS и итоговый PDF. Сказать, что это не работает или Не удалось решить мою проблему, не объяснив, что не работает или в чем проблема, обычно лишает людей возможности помочь.   -  person Bruno Lowagie    schedule 27.12.2016
comment
Кроме того: если бы вы действительно прочитали ответ на повторяющийся вопрос, вы бы не использовали HTMLWorker. Вместо этого вы будете использовать XML Worker.   -  person Bruno Lowagie    schedule 27.12.2016
comment
@BrunoLowagie в html-контенте есть только таблица внутри, просто метод добавления любого CSS решит мою проблему.   -  person Arun Prasad E S    schedule 27.12.2016
comment
Хорошо, покажите нам HTML и CSS. множество рабочих примеров в в Интернете. сайт. Однако использование HTMLWorker, как это сделано в вашем вопросе, не сработает. Измените свой вопрос, чтобы я мог видеть, что вы используете XML Worker, и я мог бы проголосовать за его повторное открытие. Однако в текущем состоянии ответ на ваш вопрос таков: то, что вы хотите, не работает с HTMLWorker, вместо этого используйте XML Worker. (Для этого требуется дополнительная DLL рядом с DLL iTextSharp.)   -  person Bruno Lowagie    schedule 27.12.2016
comment
@BrunoLowagie Я работаю над добавлением метода XmlWorker, если с помощью простого исправления это можно заставить работать. это решит   -  person Arun Prasad E S    schedule 27.12.2016
comment
Я не вижу, чтобы вы работали с XML Worker. Обновите свой вопрос, чтобы показать код XML Worker, а также HTML и CSS.   -  person Bruno Lowagie    schedule 27.12.2016
comment
@BrunoLowagie, не могли бы вы взглянуть на это.   -  person Arun Prasad E S    schedule 27.12.2016
comment
Ввод не является допустимым HTML.   -  person Bruno Lowagie    schedule 27.12.2016
comment
@BrunoLowagie Got работает, спасибо.   -  person Arun Prasad E S    schedule 27.12.2016
comment
Хорошо, я снова открыл вопрос (хотя теперь это уже не вопрос) и опубликовал код, который написал для тестирования HTML.   -  person Bruno Lowagie    schedule 27.12.2016


Ответы (1)


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

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();
}

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

введите здесь описание изображения

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

person Bruno Lowagie    schedule 27.12.2016
comment
@Брунно Лоуаги Спасибо. - person Arun Prasad E S; 24.05.2017
comment
@Bruno Я не видел нового метода ByteArrayInputStream(HTML.getBytes()). что оно делает ? - person Selman; 17.01.2018
comment
ByteArrayInputStream — это стандартный класс Java в JDK. Это реализация InputStream, которая принимает byte[] и позволяет использовать ее как InputStream. В этом нет ничего особенного. Это просто Ява. Кстати: если вы хотите преобразовать HTML в PDF, прочтите Преобразование HTML в PDF с помощью iText, прежде чем вы начнете писать код. - person Bruno Lowagie; 17.01.2018