c# – iText或iTextSharp基本文本编辑
我可以通过多种方式从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内容)中轻松检测到文本,然后只需要在一些字符串操作后重写这些流. 我给你做了一个名为 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(); } 一些警告: >我检查对象是否是流.它也可以是一系列流.在这种情况下,您需要遍历该数组. 在现实生活中,PDF文件从未如此简单,并且随着文档中使用的每个特殊功能,项目的复杂性将大大增加. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |