Как я могу определить длину куска в 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>

Вы получите куски "Заголовок", " " и "материал"!

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