使用 iTextSharp 突出显示文本减少对 PDF 文件大小的影响

Posted

技术标签:

【中文标题】使用 iTextSharp 突出显示文本减少对 PDF 文件大小的影响【英文标题】:Decreasing the impact on a PDF's file size using iTextSharp to highlight text 【发布时间】:2016-02-15 01:35:27 【问题描述】:

我能够成功使用以下代码突出显示现有 PDF 中的文本:

    private static void highlightDiff(PdfStamper stamper, Rectangle rectangle, int page)
    
        float[] quadPoints =  rectangle.Left, rectangle.Bottom, rectangle.Right, rectangle.Bottom, rectangle.Left, rectangle.Top, retangle.Right, rectangle.Top ;
        PdfAnnotation highlight = PdfAnnotation.CreateMarkup(stamper.Writer, rectangle, null, PdfAnnotation.MARKUP_HIGHLIGHT, quadPoints);
        highlight.Color = BaseColor.RED;
        stamper.AddAnnotation(highlight, page);
    

问题是我一次突出显示字符,我的猜测是每次调用此函数时都会添加一个新图层,因为在程序完成运行后生成的文件大小明显更大。

我尝试在函数末尾添加以下行,也许只有我一个人,但当我去查看它时,它似乎加快了加载 PDF 的时间,但文件的大小仍然存在非常大。

    stamper.FreeTextFlattening = true;

我可能会尝试使我的代码更高效并减少调用次数(如果我突出显示的字符彼此相邻,请找到组合的矩形并调用)但想知道是否有其他方法这。提前致谢!

【问题讨论】:

尝试为每页添加一个突出显示注释。 QuadPoints8 x n 数字的平面数组。这些数字“存储为文本”,考虑降低它们的精度,小数部分超过一位(甚至根本没有)是不必要的。将Rectangle 设置为页面尺寸。 嗯,这听起来很有趣。每页一个注释。是否可以收集我需要突出显示的所有矩形并通过一个注释进行一次调用? quadPoints 数组中每个“字符”(要突出显示的矩形区域)的 8 个数字; CreateMarkup 的单个(每页)调用的第二个参数可以是页面边界,它应该可以工作。 所以我能够像你建议的那样只用一个电话就可以让它工作,这对文件大小产生了很大的影响。很高兴知道可以通过这种方式完成,感谢您的帮助! 【参考方案1】:

每次执行highlightDiff 时,都会在 PDF 中添加一个新的高亮注释。在 PDF 中,这样的注释是这样的对象:

1 0 obj
<<
    /Rect[204.68 705.11 211.2 716.11]
    /Subtype/Highlight
    /Contents()
    /QuadPoints[204.68 716.11 211.2 716.11 204.68 705.11 211.2 705.11]
    /C[1 0 0]
    /P 2 0 R
>>

此外,还需要从页面描述中引用此对象以及内部交叉引用中的条目。

因此,每次这样的调用都会使 PDF 增长近 200 字节。如果您突出显示许多这样的单个字符,文件确实会大大增加。

我可能会尝试使我的代码更高效并减少调用次数(如果我突出显示的字符彼此相邻,请找到组合的矩形并调用)但想知道是否有其他方法这个。

如果您确实希望使用突出显示注释完成突出显示,则没有办法解决。

另一方面,如果您也接受在常规页面内容中绘制突出显示的矩形,则使用该方法可能会减少文件大小的增长。尽管如此,首先组合相邻的矩形会显着减少文件大小(和 PDF 查看器资源需求)。

【讨论】:

感谢您提供背景信息!我是使用 PDF 的新手,但一切都慢慢开始变得有意义。我减少了调用次数,文件大小确实缩小了。最终目标是突出显示文本中的特定字符。如果这可以在没有注释的情况下完成,并且不会对文件大小产生重大影响,我完全赞成。 即使没有注释,也可能会出现相当大的文件增长(尽管没有注释那么大)。因此,主要目标应该是将单个角色的亮点与更大的亮点结合起来。

以上是关于使用 iTextSharp 突出显示文本减少对 PDF 文件大小的影响的主要内容,如果未能解决你的问题,请参考以下文章

itextsharp:将文本块拆分为单词时单词被破坏

如何在flex中设置文本突出显示颜色?

javascript用户选择突出显示

使用 jQuery 突出显示一个单词

使用 Angular js、jQuery 和 Css 突出显示搜索到的文本

在 mouseup 文本选择 + HTML5/jQuery 上覆盖突出显示的文本