Rajesh Pandya Ответов: 1

Показать текст на изображении в формате PDF с помощью itextsharp


Я сгенерировал PDF-файл с помощью HTMLWorker iTextsharp. В PDF я хочу показать текст на изображении, отмечающем определенную область. Для этого я использовал тег div с позицией, но он не показывает текст на изображении, но если я запускаю тот же HTML в браузере, то он показывает текст на изображении в определенном месте.

Есть ли что-то, чего мне не хватает в моем коде? Или есть другой способ показать текст на изображении с помощью iTextsharp?

iTextsharp: Version 5.5.13.0

Ниже приведен HTML, который корректно работает в браузере:
<table style="table-layout:fixed" width="100%" style="font-family:Verdana;font-size:8px;">
    <tr>
        <td align="left"><img src="http://localhost/TheAutoAuction/img/image1.jpg" width="520"></img></td>
    </tr>
</table>
<div id="divArea1" style="position:absolute;left:50px;top:250px;;font-weight:bold;">Area1</div>


Предварительный Просмотр Текущего Выхода:
https://i.stack.imgur.com/hrRl7.png[^]

Что я уже пробовал:

StringBuilder sReportHeader = new StringBuilder();

sReportHeader.Append("<table style=\"table-layout:fixed\" width=\"100%\" style=\"font-family:Verdana;font-size:8px;\">" +
                        "<tr>" +
                            "<td align=\"left\">" + @"<img src=\"http://localhost/img/image1.jpg\" width=\"520\"></img></td>" +
                        "</tr>" +
                    "</table>" +
                    "<div id=\"divArea1\" style=\"position:absolute;left:50px;top:250px;font-weight:bold;\">Area1</div>");

MemoryStream workStream = new MemoryStream();
Document document = new Document();
var worker = new HTMLWorker(document);
var pdfWriter = PdfWriter.GetInstance(document, workStream);
document.Open();
worker.StartDocument();
pdfWriter.CloseStream = false;
TwoColumnHeaderFooter twopdf = new TwoColumnHeaderFooter();
pdfWriter.PageEvent = twopdf;
twopdf.OnOpenDocument(pdfWriter, document);
worker.Parse(new StringReader(sReportHeader.ToString()));
worker.EndDocument();
worker.Close();
document.CloseDocument();
document.Close();

byte[] byteInfo = workStream.ToArray();
workStream.Write(byteInfo, 0, byteInfo.Length);
workStream.Position = 0;
pdfWriter.Flush();
pdfWriter.Close();

return new FileStreamResult(workStream, "application/pdf");

1 Ответов

Рейтинг:
2

MadMyche

Два из самых важных правил, которые следует помнить при разработке веб-страницы::

1. Знайте, что вы агент пользователя- это способности и причуды. Не все браузеры и другие приложения рендеринга будут рендерить HTML одинаково, и они не все поддерживают все доступные версии HTML/XHTML. 20 лет назад, когда все толкали Netscape, были вещи, которые IE получил правильно, но Navigator boinked.

2. Используйте правильный код Когда HTML/XHTML недействителен, вы не знаете, каков будет эффект при его визуализации; это называется режим совместимости А что касается правила № 1, то разные пользовательские агенты будут выдавать одну и ту же ошибку по-разному. Почти каждый браузер, начиная с Firefox 3.x, неправильно закрывает сломанные теги комментариев HTML.

Что касается вашей проблемы, то это может быть комбинация из двух вышеперечисленных правил; как ваш img элемент будет недействителен:

"<td align=\"left\">" + @"<img src=\"http://localhost/img/image1.jpg\" width=\"520\"></img></td>"
должна стать
<td align="left"><img src=\"http://localhost/img/image1.jpg\" width=\"520\"></img></td>
Что неверно, это анекдот. пустой элемент означает, что нет закрывающего тега и в нем есть несколько порезов, которым не место.
Попробуйте использовать это
@"<td align=""left""><img src=""http://localhost/img/image1.jpg"" width=""520"" /></td>"
Обратите внимание, что окраска не меняется в блоках C#, когда я обернул всю строку @, избавился от косых черт и< превратил все двойные кавычки в 2-двойные кавычки.

Что вы можете сделать, если исправите свой html на 100% идеально, так это поэкспериментировать. Попробуйте сделать изображение, которое вы хотите в таблице, фоном для таблицы или ячейки, которую вы хотите, чтобы она была. Или попробуй что-нибудь другое.

Вы также можете попробовать заглянуть в iTextPDF и его HTML-возможности/причуды:
Книга : Мой HTML-код должен быть валидный XML?[^]


Rajesh Pandya

@MadMyche спасибо вам за подробный ответ. Я позабочусь о том, чтобы HTML был правильным. Спасибо за вашу помощь.