使用iTextSharp

时间:2015-11-30 09:32:00

标签: c# pdf itextsharp

我使用以下问题的答案中的代码突出显示了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。在这种情况下,要获得突出显示的文本,您需要获取存储在突出显示注释中的坐标(存储在QuadPoints数组中),您需要使用这些坐标来解析在这些坐标处页面内容中存在的文本。 / p>

1 个答案:

答案 0 :(得分:1)

获取突出显示的注释坐标

当OP澄清时,他实际上想要

  

获取突出显示的注释坐标

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

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

annotationDic.GetAsArray(PdfName.RECT)

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

annotationDic.GetAsArray(PdfName.QUADPOINTS)

描述了一组四边形。

E.g。如果来自referenced question的样本(突出显示单词&#34;支持&#34;出现在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在其评论中声称的那样

  

null值只有我得到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+1 st 注释将成为i th one。但是,要检查的下一个注释是现在的i+1 st ,将不会检查或删除前i+1 st 注释。< / p>