Никаких изменений в шрифте лица в HTML для генерации PDF с помощью iTextSharp - PullRequest
1 голос
/ 10 декабря 2011

Я использую HTML Rich-Text Editor, чтобы помочь мне создать шаблон для динамических отчетов PDF, и он работает нормально, за исключением того, что он не меняет font-face.

Этот редактор использует тег шрифта вместо стилей CSS, и я бы приветствовал любой способ программно изменить теги шрифта на эквивалентные теги с использованием стилей.

HTML (да, он грязный, из WYSIWYG-редактора):

<div>&nbsp;
<br>
  <div align="center">
    <font size="5">
      <b>
        <br>
          <div align="center">
            <font font-face="Times New Roman" size="5">
              <b>Example 
              <font size="6">Chamber 
              <font size="5">
                <font size="4">Website</font>
              </font></font>Quotes</b>
            </font>
            <font face="Times New Roman">
              <br>
                <font face="Times New Roman">
                  <br>~
                  <font face="Times New Roman" color="#0000FF">
                    <b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                    <u>&nbsp;[!PlanName]&nbsp;</u></b>
                  </font>
                  <font face="Times New Roman">
                    <br>~
                    <font face="Times New Roman" color="#0000FF">
                      <b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</b>
                    </font>
                    <font face="Times New Roman" color="#0000FF">
                      <b>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

                      <font color="#000000">Deductible&nbsp;
                      $[!PlanDeductible]:&nbsp;&nbsp;</font></b>
                    </font>
                    <font face="Times New Roman" color="#B0B0FF">
                    [!PlanRate]
                    <br>
                      <font face="Times New Roman">/~/~</font>
                      <br>
                        <br>
                          <br>
                            <font face="Courier New" size="1">
                            Copyright Example.com</font>
                            <br>
                              <br>
                                <font face="Arial">test</font>
                                <br></br>
                              </br>
                            </br>
                          </br>
                        </br>
                      </br>
                    </br></font></br>
                  </font></br>
                </font>
              </br>
            </font>
          </div>
        </br>
      </b>
    </font>
  </div>
</br></div>

C #:

public static byte[] ConvertHtmlToPdf(string html)
{
    html = HtmlPostProcessor.Process(html);
    byte[] fileData = null;
    string tempPath = ConfigurationManager.AppSettings["TempDirectory"];
    string tempPDFFile = Path.Combine(tempPath, Guid.NewGuid() + ".pdf");
    Document document = new Document(PageSize.LETTER, 50, 50, 50, 50);

    using (FileStream fs = new FileStream(tempPDFFile, FileMode.Create))
    {
        PdfWriter.GetInstance(document, fs);
        using (StringReader stringReader = new StringReader(html))
        {
            List<IElement> parsedList = HTMLWorker.ParseToList(stringReader, null );
            document.Open();
            foreach (IElement item in parsedList)
            {
                document.Add(item);
            }
            document.Close();
        }
    }

    FileStream generatedPDF = File.Open(tempPDFFile, FileMode.Open);
    fileData = new byte[(int)generatedPDF.Length]; 
    int result = generatedPDF.Read(fileData, 0, (int)generatedPDF.Length);

    generatedPDF.Close();

    File.Delete(tempPDFFile);

    return fileData;
}

EDIT

Я использую iTextSharp версии 5.1.1.0.

Ответы [ 3 ]

2 голосов
/ 10 декабря 2011

Самый простой способ грубой силы - вызвать FontFactory.RegisterDirectories () до и вызвать HTMLWorker.ParseToList(). Однако, будьте осторожны - метод пытается зарегистрировать / отобразить все шрифты в работающей системе.

Так, например, если вы работаете в ASP.NET, вы, вероятно, захотите сделать вызов в global.asax.

РЕДАКТИРОВАТЬ : рабочий пример с использованием FontFactory.RegisterDirectories() и HTML, который вы указали выше:

FontFactory.RegisterDirectories();
using (Document document = new Document()) {
  PdfWriter.GetInstance(document, Response.OutputStream);
  document.Open();
  List<IElement> objects = HTMLWorker.ParseToList(
    new StringReader(html), null);
  foreach (IElement element in objects) {
    document.Add(element);
  }
}

Просто замените Response.OutputStream на Stream на ваш выбор. Результат PDF-файл сверху .

1 голос
/ 10 декабря 2011

HTMLWorker устарел.Вам необходимо переключиться на новый класс XMLWorker .Но если вы хотите использовать HTMLWorker, вы также можете определить для него глобальный стиль:

StyleSheet styles = new StyleSheet();
styles.LoadTagStyle(HtmlTags.BODY, HtmlTags.FONTFAMILY, "tahoma");
//...
//and then
var parsedHtmlElements = HTMLWorker.ParseToList(data, styles);
0 голосов
/ 06 июня 2013

http://hivelocity.dl.sourceforge.net/project/itextsharp/itextsharp/iTextSharp-5.4.1/itextsharp-all-5.4.1.zip

там вы можете получить последнюю версию библиотеки iTextSharp (5.4.1)

http://hivelocity.dl.sourceforge.net/project/itextsharp/xmlworker/xmlworker-5.4.1/itextsharp.xmlworker-all-5.4.1.zip

а вот XML-работник ... он работает только с той же версией iTextSharp (5.4.1)

...