加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – iText或iTextSharp基本文本编辑

发布时间:2020-12-16 01:59:54 所属栏目:百科 来源:网络整理
导读:我可以通过多种方式从PDF中的页面中提取文本: String pageText = PdfTextExtractor.GetTextFromPage(reader,i); 这可用于获取页面上的任何文本. 或者: byte[] contentBytes = iTextSharp.text.pdf.parser.ContentByteUtils.GetContentBytesForPage(reader,
我可以通过多种方式从PDF中的页面中提取文本:

String pageText = PdfTextExtractor.GetTextFromPage(reader,i);

这可用于获取页面上的任何文本.

或者:

byte[] contentBytes = iTextSharp.text.pdf.parser.ContentByteUtils.GetContentBytesForPage(reader,i);

可能性是无穷无尽的.

现在我想删除/编辑某个单词,例如明确的单词,敏感的信息(在他们身上放置黑盒子显然是一个坏主意:)或者PDF中的任何内容(这只是简单的文本).我可以使用上面的方法找到这个词.我可以算一下它的出现等…

我不关心布局,或者PDF并不是真正意图以这种方式操纵的事实.

我只想知道是否有一种机制可以让我以这种方式操纵我的PDF的原始内容.你可以说我正在寻找“SetContentBytesForPage()”……

解决方法

如果要更改页面的内容,则仅更改页面的内容流是不够的.页面可能包含对包含要删除的内容的表单XObject的引用.

次要问题包括图像.例如:假设您的文档包含已经过OCR的扫描文档.在这种情况下,删除(矢量)文本是不够的,您还需要操作图像中的(像素)文本.

假设您的次要问题不存在,您需要采用双重方法:

>从页面中获取内容作为文本,以检测哪些页面中有要删除的名称或单词.
>递归循环遍历所有内容流以查找该文本并重写那些没有该文本的内容流.

从你的问题,我认为你已经解决了问题1.解决问题2并不是那么微不足道.在我的书的第15章中,我有一个示例,其中提取文本返回“Hello World”,但是当您查看内容流时,您会看到:

BT
/F1 12 Tf
88.66 367 Td
(ld) Tj
-22 0 Td
(Wor) Tj
-15.33 0 Td
(llo) Tj
-15.33 0 Td
(He) Tj
ET

在您从此流代码段中删除“Hello World”之前,您需要一些启发式方法,以便您的程序能够识别此语法中的文本.

找到文本后,需要重写流.为了获得灵感,您可以在itext-xtra包中查看OCG remover functionality.

简而言之:如果您的PDF相对简单,那就是:可以在不同的内容流(页面内容和Form XObject内容)中轻松检测到文本,然后只需要在一些字符串操作后重写这些流.

我给你做了一个名为ReplaceStream的简单示例,用PDF中的“HELLO WORLD”替换“Hello World”.

public void manipulatePdf(String src,String dest) throws IOException,DocumentException {
    PdfReader reader = new PdfReader(src);
    PdfDictionary dict = reader.getPageN(1);
    PdfObject object = dict.getDirectObject(PdfName.CONTENTS);
    if (object instanceof PRStream) {
        PRStream stream = (PRStream)object;
        byte[] data = PdfReader.getStreamBytes(stream);
        stream.setData(new String(data).replace("Hello World","HELLO WORLD").getBytes());
    }
    PdfStamper stamper = new PdfStamper(reader,new FileOutputStream(dest));
    stamper.close();
    reader.close();
}

一些警告:

>我检查对象是否是流.它也可以是一系列流.在这种情况下,您需要遍历该数组.
>我不检查是否为页面定义了表单XObject.
>我假设可以在PDF语法中轻松检测到Hello World.
> ……

在现实生活中,PDF文件从未如此简单,并且随着文档中使用的每个特殊功能,项目的复杂性将大大增加.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读