【问题标题】:Remove highlighted area in pdf using iTextSharp使用 iTextSharp 删除 pdf 中的突出显示区域
【发布时间】:2016-03-03 21:29:46
【问题描述】:

我使用以下问题答案中的代码突出显示了 pdf 中的单词:Highlight words in a pdf using itextsharp, not displaying highlighted word in browser

现在我想知道如何使用 iTextSharp 删除那些突出显示的矩形。

private void RemovehighlightPDFAnnotation(string outputFile, string highLightFile, int pageno, string highLightedText)
{
    PdfReader reader = new PdfReader(outputFile);
    using (FileStream fs = new FileStream(highLightFile, FileMode.Create, FileAccess.Write, FileShare.None))
    {
        using (PdfStamper stamper = new PdfStamper(reader, fs))
        {                
            PdfDictionary pageDict = reader.GetPageN(pageno);                
            PdfArray annots = pageDict.GetAsArray(PdfName.ANNOTS);                
            if (annots != null)
            {
                for (int i = 0; i < annots.Size; ++i)                   
                {
                    PdfDictionary annotationDic = (PdfDictionary)PdfReader.GetPdfObject(annots[i]);
                    PdfName subType = (PdfName)annotationDic.Get(PdfName.SUBTYPE);                                               
                    if (subType.Equals(PdfName.HIGHLIGHT))
                    {
                        PdfString str  = annots.GetAsString(i);
                        if(str==highLightedText)
                        {
                                annots.Remove(i); 
                        }                          

                    }
                }                  

            }
        }
    }

它删除了所有注释,但我想删除特定的注释。 假设我在第 1 页突出显示了 美国 和 专利申请公开,现在我想单独删除美国。我将传递文本美国。

我提到了这个answer。其中,要获取突出显示的文本,您需要获取存储在 Highlight 注释中的坐标(存储在 QuadPoints 数组中),并且您需要使用这些坐标来解析页面内容中在这些坐标处存在的文本。

【问题讨论】:

  • 您的意思是添加高亮作为内容的一部分的代码,而不是添加高亮作为注释的代码,我想...?
  • 我编辑了我的问题。请检查。
  • 如果我是你,我会将私人数据添加到我创建的包含突出显示的短语的注释中。当您想删除给定短语的注释时,只需检查该私有数据即可。
  • 对不起,我不知道如何获取突出显示的注释坐标?

标签: c# pdf itextsharp


【解决方案1】:

获取高亮标注坐标

正如OP澄清的那样,他实际上想要

获取突出显示的注释坐标

要从该区域提取文本,检查它是否与相关短语匹配,并(如果匹配)删除注释。

由于有问题的代码总是只用每个注释标记一个矩形,并选择矩形只包含有问题的文本,他可以简单地使用注释矩形

annotationDic.GetAsArray(PdfName.RECT)

在更一般的情况下(即,对于从一行末尾开始并在下一行开头结束的高亮注释),他需要检查四边形点

annotationDic.GetAsArray(PdfName.QUADPOINTS)

描述一组四边形。

例如对于来自referenced question 的示例(突出显示OP 示例PDF 的第三个文档页面上出现“支持”一词),方法

private void ReportHighlightPDFAnnotation(string highLightFile, int pageno)
{
    PdfReader reader = new PdfReader(highLightFile);
    PdfDictionary pageDict = reader.GetPageN(pageno);
    PdfArray annots = pageDict.GetAsArray(PdfName.ANNOTS);
    if (annots != null)
    {
        for (int i = 0; i < annots.Size; ++i)
        {
            PdfDictionary annotationDic = (PdfDictionary)PdfReader.GetPdfObject(annots[i]);
            PdfName subType = (PdfName)annotationDic.Get(PdfName.SUBTYPE);
            if (subType.Equals(PdfName.HIGHLIGHT))
            {
                Console.Write("HighLight at {0} with {1}\n", annotationDic.GetAsArray(PdfName.RECT), annotationDic.GetAsArray(PdfName.QUADPOINTS));
            }
        }
    }
}

报告

HighLight at [224.65, 654.03, 251.08, 662.03] with [221.65, 654.03, 251.08, 654.03, 221.65, 663.03, 251.08, 663.03]
HighLight at [80.9, 574.13, 107.28, 582.13] with [77.9, 574.13, 107.28, 574.13, 77.9, 583.13, 107.28, 583.13]
HighLight at [209.3, 544.33, 235.67, 552.33] with [206.3, 544.33, 235.67, 544.33, 206.3, 553.33, 235.67, 553.33]

尤其是那些值不是null,正如 OP 在他的评论中声称的那样

只有我为 PdfArray annots = pageDict.GetAsArray(PdfName.QUADPOINTS) 和 annotationDic.GetAsArray(PdfName.RECT) 得到空值

另一种方法

如果我是 OP,我会将私有数据添加到我创建的包含突出显示的短语的注释中。当他想删除给定短语的注释时,他可以简单地检查该私有数据。

文本提取,即使是从有限的区域,也是一项非常昂贵的操作,因为必须解析页面内容流和可能的大量表单 xobject 流。

关于循环设计的警告

OP 想要删除此循环中的注释:

for (int i = 0; i < annots.Size; ++i)                   
{
    PdfDictionary annotationDic = (PdfDictionary)PdfReader.GetPdfObject(annots[i]);
    PdfName subType = (PdfName)annotationDic.Get(PdfName.SUBTYPE);                                               
    if (subType.Equals(PdfName.HIGHLIGHT))
    {
        PdfString str  = annots.GetAsString(i);
        annots.Remove(i);                           
    }
}                  

问题:如果他在索引i 并删除此注释,则以前的i+1st 注释变为ith 一个。不过,下一个要检查的注解是现在的i+1st,以前的i+1st 注解将不会被检查或删除。

【讨论】:

  • 只有 PdfArray annots = pageDict.GetAsArray(PdfName.QUADPOINTS) 和 annotationDic.GetAsArray(PdfName.RECT) 的空值我想要突出显示的单词或注释中的坐标
  • pageDict.GetAsArray(PdfName.QUADPOINTS) 显然无济于事。
  • 我想要突出显示的单词或注释中的坐标,好的,谢谢你的帮助。
  • 对不起,这是我的错误。我替换了这个 PdfArray annots = pageDict.GetAsArray(PdfName.ANNOTS);进入 PdfArray annots = pageDict.GetAsArray(PdfName.QUADPOINTS);非常感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 2014-12-26
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多