删除或覆盖特定位置的PDF上的文本

时间:2017-08-01 14:26:18

标签: pdf text itext pdf-generation

我正在为我的问题搜索解决方案。

我尝试使用itextsharp修改出现在pdf文档特定位置的文本。

有人可以帮忙吗?

SOLUTION:

我已经决定写这个:

public bool StampOnPDF(string _PathPDF, string _text, string _Total)
    {
        string _fileName = Path.GetFileName(_PathPDF);

        string oldFile = _PathPDF;
        string BackupPDF = _PathPDF.Replace(".pdf", "_old.pdf");

        File.Copy(oldFile, BackupPDF);

        iTextSharp.text.Rectangle Zone1 = new iTextSharp.text.Rectangle(495, 157, 540, 148);
        iTextSharp.text.Rectangle Zone2 = new iTextSharp.text.Rectangle(495, 130, 540, 105);

        using (PdfReader reader = new PdfReader(BackupPDF))
        using (PdfStamper stamper = new PdfStamper(reader, new FileStream(oldFile, FileMode.Create)))
        {                
            PdfContentByte pbover = stamper.GetOverContent(1);
            Zone1.BackgroundColor = BaseColor.WHITE;
            pbover.Rectangle(Zone1);
            Zone2.BackgroundColor = BaseColor.WHITE;
            pbover.Rectangle(Zone2);               

            // select the font properties
            var normalFont = FontFactory.GetFont(FontFactory.HELVETICA, 12);
            var boldFont = FontFactory.GetFont(FontFactory.HELVETICA_BOLD, 12);

            normalFont.Size = 8;
            boldFont.Size = 8;

            string text = _testo;                
            ColumnText.ShowTextAligned(pbover, Element.ALIGN_CENTER, new Phrase(text, normalFont), 300, 180, 0);

            text = _Total;
            ColumnText.ShowTextAligned(pbover, Element.ALIGN_CENTER, new Phrase(text, boldFont), 523, 115, 0);
            ColumnText.ShowTextAligned(pbover, Element.ALIGN_CENTER, new Phrase(text, normalFont), 523, 150, 0);

        }    
        return true;                                  
    }               

1 个答案:

答案 0 :(得分:3)

这个问题不是一个小问题。 为了理解原因,让我们看一段PDF文档。

[a, -28.7356, p, 27.2652, p, 27.2652, e, -27.2652, a, -28.7356, r, 64.6889, a, -28.7356, n, 27.2652, c, -38.7594, e, 444] TJ
/R10 10.44 Tf
68.16 0.24 Td
[", 17.1965, P, -18.7118, i, -9.35592, l, -9.35592, o, -17.2414, t, -9.35636, ", 17.1965, , 250] TJ

这段代码告诉观众渲染单词"外观"。 你在这里看到的是每个呈现的单个字母。 语法是<字距信息> <字母GT; TJ(=文本渲染指令)。

这应该让你知道用其他东西替换一段文字会有多难。 如果您将现有单词缩短,则需要再次移动所有其他字母。这个问题被称为" reflowing"文本。回流,不是可以通过pdf文档轻松完成的事情。要实现重排,您需要高级信息(例如哪些单词属于哪些段落)。这种信息水平通常不存在于pdf文档中。

正如@mkl指出的那样,如果您只想删除文本(可能用黑框覆盖它以表明它已被删除),iText肯定可以帮助您。

如果您想覆盖文字,那么(通常)不可能。如果您替换它的单词具有相同的字母并且您不太关心布局,则可以这样做。 (因为像" iText"这样的词可能不会占用与#34; Jazzy")相同的空间。