0

我正在设法从电子邮件中生成一个 PDF 文件,我实际上是通过MailKit.

生成 pdf 文件本身没有实际问题(我正在向PdfWriter实例提供由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());
}
4

1 回答 1

1

iText 中的类TextChunk与文本提取有关,而您的代码与 PDF 生成有关。在评论中,您澄清说,您的用例不仅包括 PDF 生成,还包括这些 PDF 的内容受文本提取的后续步骤,并且您希望以某种方式以文本提取的方式生成 PDF step 使 中的TextChunk实例LocationTextExtractionStrategy总是包含一个完整的单词。

首先,提取文本的度不仅仅是所讨论的 PDF 生成器的自定义怪癖,一个块有一个最大长度,它必须停在第一个字符处,该字符会改变当前设置,例如颜色, font, font size, ..., 或者与前一个字符的距离不是由前一个字符的宽度单独决定的。

虽然前一种设置很少在一个单词中改变(但即使它们偶尔会改变),但如果 PDF 生成器通过应用字距调整来美化书面文本,则后一种异常可能会经常发生。

因此,对于支持字距调整的 PDF 生成器,您通常会得到比单词小的块,并且除非您拒绝支持字距调整,否则您无法阻止这种情况。

但是,在这些限制允许的范围内,它通常是 PDF 生成器的实现细节,块得到多长时间,它通常是不可配置的。

在手头的情况下:iText,对于要求绘制的每个连续文本,创建尽可能长的块,您无法通过配置更改此设置。

但是,您可以做的是根据您的要求减少您绘制的连续文本!例如对于

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

你得到一个单一的块“标题材料”,但对于

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

你得到块“标题”,“”和“材料”!

于 2019-01-18T15:48:41.010 回答