itext替换pdf中的中文

本文介绍如何使用iText库在PDF文件中替换中文文本。文章提供了两种方法,一种是通过Aspose.pdf库,另一种是通过Java代码直接定位并替换文本。作者详细解释了每种方法的优缺点,并提供了具体的Java代码实现,包括如何查找和替换PDF中的特定文字,以及如何处理多页和长文本替换的问题。
摘要由CSDN通过智能技术生成

在网上找了一段时间,发现有两个版本的

1,使用aspose.pdf,这篇文章写得很清楚https://blog.csdn.net/da_keng/article/details/65633498,我稍微改了一下,可以替换多个字符

public static void main(String[] args) {
    String srcPath = "E:\\CA\\入职合同模版样例.pdf";
    String targetPath = "E:\\CA\\out.pdf";
    Map<String, String> map = new HashMap<String, String>();
    map.put("[$合同编号$]", "ZR-20181009-00000164");
    map.put("[$乙方姓名$]", "TroubleA");
    map.put("[$签字日期$]", "2018/10/10 11:24:30");
    test(srcPath, targetPath, map);
}

public static void test(String srcPath, String targetPath, Map<String, String> map){
    InputStream license = Main.class.getClassLoader().getResourceAsStream("\\license.xml");
    try {
        new License().setLicense(license);
    } catch (Exception e) {
        e.printStackTrace();
    }
    Document pdfDoc = new Document(srcPath);
    for (Map.Entry<String, String> entry : map.entrySet()) {
        System.out.println("Key = " + entry.getKey() + ", Value = " + entry.getValue());

        TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(entry.getKey());
        PageCollection pages = pdfDoc.getPages();
        System.out.println("文档总页码数:"+pages.size());
        pages.accept(textFragmentAbsorber);
        int i = 0;
        for (TextFragment textFragment :(Iterable<TextFragment>) textFragmentAbsorber.getTextFragments()) {
            textFragment.setText(entry.getValue());
            textFragment.getTextState().setBackgroundColor(com.aspose.pdf.Color.getRed());  //添加红色背景
            System.out.println(++i);
        }
    }
    pdfDoc.save(targetPath);
}

2,像这位链接中的大佬一样,https://blog.csdn.net/sishenkankan/article/details/53107195,使用具体的java代码去寻找x,y的位置然后画一个白板覆盖再重新写上需要替换的文字,有以下两个缺点,

a)当需要替换的文字不在一个TextRenderInfo里面,无法找到比较长的需要替换的

b)当pdf包含有多页的时候,不方便具体的控制替换到哪一页

所以我又百度了一个能够定位pdf中需要替换的文字位置的方法,https://blog.csdn.net/sdizoea/article/details/75105798,像文中大佬一样直接定位然后解决了文字不在一个块中时查找的麻烦,贴一下所有的代码,一共有6个类,

package com.sinosoft.lis.utils;

import com.itextpdf.text.BaseColor;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.log.Logger;
import com.itextpdf.text.log.LoggerFactory;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;

import java.io.*;
import java.net.URLDecoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;

/**

  • 替换PDF文件某个区域内的文本
    */
    public class PdfReplacer {
    private static final Logger logger = LoggerFactory.getLogger(PdfReplacer.class);

    private int fontSize;
    private Map<String, ReplaceRegion> replaceRegionMap = new HashMap<String, ReplaceRegion>();
    private Map<String, String> replaceTextMap =new HashMap<String, String>();
    private ByteArrayOutputStream output;
    private PdfReader reader;
    private PdfStamper stamper;
    private PdfContentByte canvas;
    private Font font;

    public PdfReplacer(byte[] pdfBytes) throws DocumentException, IOException{
    init(pdfBytes);
    }

    public PdfReplacer(String fileName) throws IOException, DocumentException{
    FileInputStream in = null;
    try{
    in =new FileInputStream(fileName);
    byte[] pdfBytes = new byte[in.available()];
    in.read(pdfBytes);
    init(pdfBytes);
    }finally{
    in.close();
    }
    }

    private void init(byte[] pdfBytes) throws DocumentException, IOException{
    logger.info(“初始化开始”);
    reader = new PdfReader(pdfBytes);
    output = new ByteArrayOutputStream();
    stamper = new PdfStamper(reader, output);
    canvas = stamper.getOverContent(1);
    setFont(10);
    logger.info(“初始化成功”);
    }

    private void close() throws DocumentException, IOException{
    if(reader != null){
    reader.close();
    }
    if(output != null){
    output.close();
    }

     output=null;
     replaceRegionMap=null;
     replaceTextMap=null;
    

    }

    public void replaceText(float x, float y, float w,float h, String text){
    ReplaceRegion region = new ReplaceRegion(text); //用文本作为别名
    region.setH(h);
    region.setW(w);
    region.setX(x);
    region.setY(y);
    addReplaceRegion(region);
    this.replaceText(text, text);
    }

    public void replaceText(String name, String text){
    this.replaceTextMap.put(name, text);
    }

    /**

    • 替换文本
    • @throws IOException
    • @throws DocumentException
      */
      private void process() throws DocumentException, IOException{
      try{
      parseReplaceText();
      canvas.saveState();
      Set<Entry<String, ReplaceRegion>> entrys = replaceRegionMap.entrySet();
      for (Entry<String, ReplaceRegion> entry : entrys) {
      ReplaceRegion value = entry.getValue();
      canvas.setColorFill(BaseColor.RED);
      canvas.rectangle(value.getX(),value.getY(),value.getW(),value.getH());
      }
      canva
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值