Как я могу определить длину куска в PDF, сгенерированном из HTML?
Мне удается создать PDF-файл из электронной почты, которую я на самом деле получаю через MailKit
,
Там нет реальной проблемы при создании самого файла PDF (я предоставляю PdfWriter
Экземпляр чистый, обновленный и готовый к использованию HTML, предоставленный HtmlAgilityPack
).
Я просто хочу указать каждое слово, чтобы быть одним TextChunk
вместо каждой отдельной фразы, которая на самом деле то, что пишет. Я догадался, что это что-то "конкретное", так как в зависимости от принтера / генератора PDF это применимо к некоторым документам, TextChunk
состав просто меняется, иногда это фразы, слова или даже отдельные символы.
Есть ли способ указать каждый новый блок для вставки в документ как одно слово?
Это мой код, но я до сих пор не понял, как указать этот уровень "детализации фрагмента".
using (var ms = new MemoryStream())
{
using (var doc = new Document())
{
using (var writer = PdfWriter.GetInstance(doc, ms))
{
doc.Open();
using (var srHtml = new StringReader(message.Body.HtmlBody))
{
XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml);
}
doc.Close();
}
}
File.WriteAllBytes(_outputPath, ms.ToArray());
}
1 ответ
Класс TextChunk
в iText связан с извлечением текста, в то время как ваш код о генерации PDF. В комментарии вы пояснили, что ваш вариант использования включает в себя не только генерацию PDF, но и более поздний этап, на котором содержимое этих PDF-файлов подлежит извлечению текста, и что вы хотите каким-то образом создавать PDF-файлы таким образом, чтобы при извлечении текста шаг вызывает TextChunk
случаи в LocationTextExtractionStrategy
чтобы всегда содержать одно, полное слово каждый.
Прежде всего, объем извлеченного текста - это не просто особенность рассматриваемого генератора PDF, он имеет максимальную длину куска, он должен останавливаться на первом символе, для которого что-то изменяется в текущих настройках, например цвет, font, size font, ... или для которого расстояние до предыдущего символа не определяется шириной только этого предыдущего символа.
В то время как первые настройки редко меняются в слове (но даже иногда они изменяются), последняя аномалия может происходить довольно часто, если генератор PDF украшает письменный текст, применяя кернинг.
Таким образом, для генераторов PDF с поддержкой кернинга вы обычно получаете куски меньше, чем слова, и вы не можете предотвратить это, если не откажетесь от поддержки кернинга.
Однако в пределах диапазона, допускаемого этими ограничениями, обычно это деталь реализации генератора PDF, как долго получают чанки, обычно это не настраивается.
В данном случае: iText, для каждого последующего фрагмента текста, который его просят нарисовать, создает фрагменты как можно дольше, вы не можете изменить это по конфигурации.
Однако то, что вы можете сделать, - это вырезать последовательные фрагменты текста, которые вы рисуете, в соответствии с вашими требованиями! Например, для
<html><body><p>Header material</p></body></html>
Вы получаете один кусок "Материал заголовка", но для
<html><body><p><span>Header</span> <span>material</span></p></body></html>
Вы получите куски "Заголовок", " " и "материал"!