直接说问题,itext没有直接提供替换PDF中文本的接口(查看资料得到的结论是PDF不支持这种操作),不过存在解决思路:
在需要替换的文本上覆盖新的文本
。按照这个思路我们需要解决以下几个问题:
-
itext怎样增加白色底的覆盖层
-
找到覆盖层的位置(左顶点的位置)和高度与宽带
这样做的目的是什么了?也告诉下大家,比如:现在要你将业务数据导出成PDF存档,且PDF的模板有现成的。对我们写程序的来说,变化的只是部分数据,假如我们可以直接替换里面的数据,是不是可以节省我们的开发时间。
1、itext怎样增加覆盖层?
itext在自己的Demo中提供了很多案例代码,从中我们可以看到高亮的案例
查看itext代码
[java]
view plain
copy
* This example was written in answer to the question:
* http://stackoverflow.com/questions/33952183
package sandbox.stamper;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
* @author Bruno Lowagie (iText Software)
public
class HighLightByAddingContent {
public
static
final String SRC =
"resources/pdfs/hello.pdf";
public
static
final String DEST =
"results/stamper/hello_highlighted.pdf";
public
static
void main(String[] args)
throws IOException, DocumentException {
File file =
new File(DEST);
file.getParentFile().mkdirs();
new HighLightByAddingContent().manipulatePdf(SRC, DEST);
public
void manipulatePdf(String src, String dest)
throws IOException, DocumentException {
PdfReader reader =
new PdfReader(src);
PdfStamper stamper =
new PdfStamper(reader,
new FileOutputStream(dest));
PdfContentByte canvas = stamper.getUnderContent(
1);
canvas.saveState();
canvas.setColorFill(BaseColor.YELLOW);
canvas.rectangle(
36,
786,
66,
16);
canvas.fill();
canvas.restoreState();
stamper.close();
reader.close();
这里可以在任意位置产生一个层,符合我们的“遮盖层”的要求,不过,通过测试发现此段代码存在一个问题点,它无法遮挡住文字,只是添加了一个背景层。为了达到我们的要求,我们只需要修改一处地方: