Изображение не отображается в сгенерированном itextsharp документе html в pdf, когда высота / ширина добавлены в стиле

Я работаю над динамическим HTML в PDF-документ и использую ckeditor для написания HTML, а затем itextsharp 5.5.10 для создания из него загружаемого PDF-файла. Ниже приведен код, который я использую

string htmlText = "some basic HTML I wrote in ckeditor 4.0 and save in my DB to retrieve later"


StringReader sr = new StringReader(htmlText);
Document pdfDoc = new Document(PageSize.A4, 0, 0, 0, 18f);
PdfWriter writer = PdfWriter.GetInstance(pdfDoc, Response.OutputStream);


// instantiate the custom PdfPageEventHelper
MyPageEventHandler e = new MyPageEventHandler()
     {
    ImageHeader = imageHeader
};
writer.PageEvent = e;

pdfDoc.Open();
XMLWorkerHelper.GetInstance().ParseXHtml(writer, pdfDoc, sr);
pdfDoc.Close();

// Auto Download option
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment;filename=Proposal-" + pid + ".pdf");
Response.Cache.SetCacheability(HttpCacheability.NoCache);
Response.Write(pdfDoc);
Response.End();

Теперь все работает нормально, благодаря этой замечательной библиотеке itextsharp, однако иногда она не добавляет несколько изображений в файл PDF.

Во время отладки я обнаружил, что переменная htmlText имеет тот же входной HTML-код, который я сохранил с помощью ekeditor, и он также содержит все теги img, но все же некоторые изображения не отображаются в PDF.

Ниже несколько тегов в моем HTML

<img alt="" src="http://www.mydomain/fullpath/13101571jjc-banner.png" />
<img alt="" src="http://www.mydomain/fullpath/0c1bc6fbchart-1.png" style="width:400px" />
<img alt="" src="http://www.mydomain/fullpath/f7802520graph1.png" style="height:288px; width:643px" />
<img alt="" src="http://www.mydomain/fullpath/4cd70c03sample_s-l_DISTRIBUTION.jpg" style="height:756px; width:1056px" />

и 4-е изображение не отображается в моем PDF-файле. **

Я понимаю, что это может иметь какое-то отношение к атрибутам Height и Width в теге img, но я не могу решить эту проблему.

Примечание: изображение отображается правильно, когда я удаляю либо Height, либо Width, либо оба атрибута из тега img. Но фактический пользователь, использующий мой код, не будет делать этого каждый раз, когда добавит новое изображение в HTML, поэтому я ищу здесь подходящее решение.

Заранее благодарим вас за любые предложения и решения.

Вы уверены, что это .jpg, а все остальное .png?

h_matze_h 11.04.2018 12:42
"ширина: 1056 пикселей" - это шире страницы А4, не так ли? Таким образом, это изображение просто не помещается в ваш документ.
mkl 11.04.2018 12:57

Также: почему вы используете выпуск iText Обслуживание (от серии iText 5 отказываются, как и от XML Worker), в то время как iText 7 имеет гораздо лучшую поддержку HTML в PDF с надстройка pdfHTML. Вам не придется переписывать много кода для обновления; наоборот: вам просто нужно удалить много строк кода. См. HTML в PDF учебник. Будет сложно найти добровольную поддержку XML Worker, поэтому используйте iText 7 + pdfHTML вместо iText 5 + XML Worker.

Bruno Lowagie 11.04.2018 12:59

@h_matze_h да, это jpg и другие png.

Dashrath 11.04.2018 13:04

@mkl Я вижу, что это большое изображение, но lib очень хорошо работает с большими изображениями без атрибута Width в Style. Но, как я уже сказал, фактический пользователь, использующий мой код, не будет делать этого каждый раз, когда они добавляют новое изображение в HTML, а ckeditor добавляет эти атрибуты из размера изображения по умолчанию.

Dashrath 11.04.2018 13:05

@BrunoLowagie, спасибо за эту замечательную библиотеку. Я новичок в этом, и во время запуска проекта я нашел соответствующие демонстрации в версии itext 5.5, и у меня тоже все работало, поэтому я использовал ее. Теперь я могу работать над его переносом, так как у меня есть больше времени, чтобы поработать над ним, ИЛИ теперь, решит ли он текущую проблему, с которой я столкнулся? Пожалуйста, предложите лучший подход.

Dashrath 11.04.2018 13:09

Если вы укажете "width: 1056px" в атрибуте стиля, вы укажете, что хотите, чтобы изображение отображалось с этой шириной. А поскольку страница формата А4 не имеет такой ширины, это невозможно. Если текущие инструменты, используемые в вашем рабочем процессе, создают такие останавливающие шоу атрибуты, они могут быть неподходящими. В качестве альтернативы вы можете сначала проанализировать файлы HTML, проверить их на наличие несоответствующих атрибутов и исправить их.

mkl 11.04.2018 13:14

Я согласен с тем, что говорит @mkl.

Bruno Lowagie 11.04.2018 13:15

Спасибо за помощь :) Сейчас поработаю соответственно.

Dashrath 11.04.2018 13:21

Хорошо, сделаю комментарий в качестве ответа.

mkl 11.04.2018 13:42

Какой должна быть максимальная ширина и максимальная высота изображения для правильной печати?

Dashrath 11.04.2018 16:09
0
11
1 229
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

С одной стороны, атрибут style вашего проблемного изображения выглядит так:

style="height:756px; width:1056px"

С другой стороны, вы используете документ формата A4.

Document pdfDoc = new Document(PageSize.A4, 0, 0, 0, 18f);

а страница A4 имеет ширину около 8,27 дюйма, что при 96 пикселей на дюйм составляет около 794 пикселей.

Таким образом, ширины страницы A4 просто недостаточно для изображения шириной 1056 пикселей!

Таким образом, чтобы разместить изображение, вы можете либо

  • измените размер документа на более широкий или
  • перед загрузкой HTML в iTextSharp примените шаг предварительной обработки, который проверяет его на предмет несоответствующих значений атрибутов и исправляет их, или
  • измените процесс генерации HTML, чтобы не создавать такие несоответствующие значения атрибутов для начала.

В дополнительном комментарии вы спросили

What should be the max-width and max-height of an image in order to get it printed correctly?

Учитывая, что вы явно устанавливаете левое, правое и верхнее поле на 0, а нижнее поле на 18 пользовательских единиц (по умолчанию пользовательская единица составляет 1/72 дюйма), максимальная ширина изображения, вероятно, будет около 794 пикселей, а максимальное изображение высота примерно (1122-18 * 96/72) пикселей = 1098 пикселей. Обязательно вычтите еще несколько пикселей.

Это, конечно, зависит от вашего HTML, не добавляющего дополнительных полей или границ ячеек или чего-либо еще вокруг изображения ...

Эй, это может быть совершенно другая проблема, НО теперь, когда я использую путь к изображениям с https, он не отображается в PDF. мой домен использует https. Изображения хорошо работают, когда я использую только http: //. Любые предложения, пожалуйста?

Dashrath 21.04.2018 17:48

ну, это это совсем другой вопрос. И я сразу не понимаю, чем это вызвано. Таким образом, сделайте это самостоятельным вопросом, чтобы другие могли внести свой вклад.

mkl 22.04.2018 07:27

Другие вопросы по теме