Как я могу определить длину куска в PDF, сгенерированном из HTML? - PullRequest
0 голосов
/ 14 января 2019

Мне удается сгенерировать файл 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 Ответ

0 голосов
/ 18 января 2019

Класс TextChunk в iText связан с извлечением текста, в то время как ваш код о генерации PDF. В комментарии вы пояснили, что ваш вариант использования включает в себя не только генерацию PDF, но и более поздний этап, на котором содержимое этих PDF-файлов подлежит извлечению текста, и что вы хотите каким-то образом создавать PDF-файлы таким образом, чтобы при извлечении текста шаг заставляет TextChunk экземпляры в LocationTextExtractionStrategy всегда содержать по одному полному слову.

Прежде всего, chunkiness извлеченного текста - это не просто особая особенность рассматриваемого генератора PDF, это максимальная длина фрагмента, она должна останавливаться на первом символе, для которого что-то изменения текущих настроек, например цвет, шрифт, размер шрифта, ... или для которого расстояние до предыдущего символа не определяется шириной только этого предыдущего символа.

В то время как первые настройки редко меняются в слове (но даже иногда они изменяются), последняя аномалия может происходить довольно часто, если генератор PDF украшает письменный текст с применением кернинга.

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

В пределах диапазона, разрешенного этими ограничениями, обычно это детали реализации генератора PDF, как долго эти блоки получают, обычно это не настраивается.

В данном случае: iText, для каждого последующего фрагмента текста, который его просят нарисовать, создает фрагменты, которые являются максимально длинными, вы не можете изменить это конфигурацией.

Тем не менее, вы можете вырезать последовательные фрагменты текста, которые вы рисуете, в соответствии с вашими требованиями! Например. для

<html><body><p>Header material</p></body></html>

вы получаете один блок "Материал заголовка", но за

<html><body><p><span>Header</span> <span>material</span></p></body></html>

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

...