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 Tf88.66 367 Td(ld) Tj-22 0 Td(Wor) Tj-15.33 0 Td(llo) Tj-15.33 0 Td(He) TjET
在您从此流代码段中删除“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文件从未如此简单,并且随着文档中使用的每个特殊功能,项目的复杂性将大大增加.
总结以上是内存溢出为你收集整理的c# – iText或iTextSharp基本文本编辑全部内容,希望文章能够帮你解决c# – iText或iTextSharp基本文本编辑所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)