精华内容
下载资源
问答
  • 修改pdf中的文字
    2020-12-10 07:59:56

    这是可能的,但不一定容易,因为PDF格式非常丰富。您可以找到详细描述它的文档here。第一个基本示例介绍了PDF如何显示文本:BT

    /F13 12 Tf

    288 720 Td

    (ABC) Tj

    ET

    BT和ET是开始和结束文本对象的命令;Tf是使用外部字体资源F13(恰好是Helvetica)的命令,大小为12;Td是将光标定位在给定坐标的命令;Tj是为前一个字符串写入glyph的命令。它的风格有点像“反向波兰符号”(reverse-polish notation),而且确实非常接近Postscript的风格,Postscript是Adobe对排版的另一个重要贡献之一。在

    问题是,PDF规范中没有任何规定,在页面上“看起来”像是属于一起的文本实际上必须“在”在一起;由于总是可以给出精确的坐标,如果PDF是由复杂的排版布局系统生成的,它可能会逐字符精确地定位文本,通过坐标。因此,以单词和句子的形式重建文本并不一定容易,它几乎和光学文本识别一样困难,只是你被精确地给出了字符(好吧,几乎。。。一些所谓的“图像”实际上可能显示为字符…;-)。在

    pyPdf是一个非常简单的纯Python库,它是处理PDF文件的良好起点。它的“文本提取”功能非常简单,除了连接几个文本绘图命令的参数之外什么也不做;你会看到,在某些文档上已经足够了,而在其他文档上则很不可用,但至少这只是一个开始。在分发时,pyPdf对颜色几乎不做任何处理,但使用了一些可以补救的黑客攻击。在

    reportlab强大的Python库完全专注于生成新的pdf,而不是解释或修改现有的pdf。在另一个极端,纯Python库pdfminer完全专注于解析PDF文件;它确实做了一些集群,试图在更简单的库遇到问题时重建文本。在

    我不知道有没有一个现有的库可以执行您希望的转换任务,但是可以将这些现有的库混合并匹配以完成大部分任务。。。祝你好运!在

    更多相关内容
  • itext修改pdf文字

    2022-07-13 23:00:34
    该demo是基于itext对PDF特殊信息进行脱敏处理,提供如下2种方法

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档


    Git项目地址

    POM文件

      <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>itextpdf</artifactId>
                <version>5.5.13.1</version>
            </dependency>
            <dependency>
                <groupId>com.itextpdf</groupId>
                <artifactId>itext-asian</artifactId>
                <version>5.2.0</version>
            </dependency>
    
            <dependency>
                <groupId>org.apache.pdfbox</groupId>
                <artifactId>pdfbox</artifactId>
                <version>2.0.21</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.83</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>RELEASE</version>
                <scope>compile</scope>
            </dependency>
    

    如何使用

    原pdf

    blog.csdnimg.cn/6c5412af6cd64d56bb45847c81f6a686.png)

    结果
    在这里插入图片描述

    字符替换

    //输入文件
            String source = "G:/问题文件/测试.pdf";
            //输出文件
            String target = "G:/问题文件/test222.pdf";
    
            //字符串替换,注意设置maxDistance的值,maxDistance太小将无法正常替换文字
            ITextPdfUtil.stringReplace(source, target, "颜色 ",30,"*****");
       
    

    关键字后文字替换

    //输入文件
            String source = "G:/问题文件/测试.pdf";
            //输出文件
            String target = "G:/问题文件/test222.pdf";
            //关键字之后替换,仅仅支持关键字之后的100范围内的文字覆盖,超出范围将覆盖不到
            ITextPdfUtil.afterKeyReplace(source, target, "签字",50,"*****");
    
    

    工具类

    import java.awt.image.BufferedImage;
    import java.io.*;
    import java.util.*;
    import java.util.List;
    
    import com.itextpdf.text.*;
    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 com.itextpdf.text.pdf.parser.ImageRenderInfo;
    import com.itextpdf.text.pdf.parser.PdfReaderContentParser;
    import com.itextpdf.text.pdf.parser.RenderListener;
    import com.itextpdf.text.pdf.parser.TextRenderInfo;
    import org.apache.pdfbox.pdmodel.PDDocument;
    import org.apache.pdfbox.rendering.PDFRenderer;
    
    import javax.imageio.ImageIO;
    
    import static com.itextpdf.text.pdf.PdfWriter.getInstance;
    
    public class ITextPdfUtil {
        /**
         * @Description : 字符串替换
         * @Author : mabo
         * maxDistance 字符之间最大距离
        */
        public static boolean stringReplace(String source, String target, String keyword,float maxDistance,String replace) throws Exception{
            boolean success =false;
            List<String> keywords = new ArrayList<>();
            keywords.add(keyword);
            success = manipulatePdf(source, target, keywords, replace);
            if (!success){
                success = compareText(source, target, keyword, maxDistance, replace);
            }
            return success;
        }
    
    
        /**
         * @Description : 关键字替换
         * @Author : mabo
         * maxDistance 字符之间最大距离
         */
        public static boolean afterKeyReplace(String source, String target, String keyword,float maxDistance,String replace) throws Exception{
            boolean success =false;
            List<String> keywords = new ArrayList<>();
            keywords.add(keyword);
            success = manipulatePdfAfterKey(source, target, keywords, replace);
            if (!success){
                success = compareTextAfterKey(source, target, keyword, maxDistance, replace);
            }
            return success;
        }
    
    
    
    
        /**
         * @Author mabo
         * @Description
         * 由于部分pdf文字会被分割
         * 采用如下文字分割方式,寻找距离最近的字符再进行匹配
         */
    
        public static boolean compareText(String src, String dest, String keyword,float maxDistance,String replace) throws Exception {
            boolean success=false;
            PdfReader pdfReader = null;
            PdfStamper stamper = null;
            try {
                pdfReader = new PdfReader(src);
                stamper = new PdfStamper(pdfReader, new FileOutputStream(dest));
                char[] chars = keyword.toCharArray();
                HashMap<String, List<PdfBDO>> textMap = new HashMap<>();
                for (char c: chars) {
                    String s = String.valueOf(c);
                    List<PdfBDO> textLineModes = renderText(pdfReader, s);
                    textMap.put(s,textLineModes);
                }
                List<PdfBDO> textLineModes = textMap.get(String.valueOf(chars[0]));
                Map<Float,Float> mapY = new HashMap<>();
                for (PdfBDO textLineMode: textLineModes) {
                    //根据首字符 找出同一行的文字
                    float y = textLineMode.getY();
                    float x = textLineMode.getX();
                    mapY.put(y,x);
                }
                Set<Float> floats = mapY.keySet();
                Iterator<Float> iterator = floats.iterator();
                HashMap<Float, Map<String,PdfBDO>> keyYMap = new HashMap<>();
                while (iterator.hasNext()){
                    Float y = iterator.next();
                    Float x = mapY.get(y);
                    HashMap<String, PdfBDO> tMap = new HashMap<>();
                    for (int i = 0; i < chars.length; i++) {
                        char c=chars[i];
                        List<PdfBDO> textLineModes1 = textMap.get(String.valueOf(c));
                        for (PdfBDO t : textLineModes1) {
                            if (t.getY()==y){
                                //判断两文字之间的具体是否符合要求
                                float x1 = t.getX();
                                float absoluteValue = getAbsoluteValue(x1, x);
                                if (absoluteValue<maxDistance){
                                    Object o = tMap.get(String.valueOf(c));
                                    if (o!=null){
                                        PdfBDO o1 = (PdfBDO) o;
                                        if (getAbsoluteValue(o1.getX(),x)>absoluteValue){
                                            tMap.put(String.valueOf(c),t);
                                        }
                                    }
                                    else {
                                        tMap.put(String.valueOf(c),t);
                                    }
                                }
                            }
                        }
                    }
                    keyYMap.put(y,tMap);
                }
                Set<Float> keySet = keyYMap.keySet();
                Iterator<Float> iterator1 = keySet.iterator();
                while (iterator1.hasNext()){
                    Float next = iterator1.next();
                    Map<String,PdfBDO> map = keyYMap.get(next);
                    if (map.size()==chars.length){
                        PdfBDO t = map.get(String.valueOf(chars[0]));
                        PdfBDO endPdfBDO = map.get(String.valueOf(chars[chars.length - 1]));
                        float x = t.getX();
                        float y = t.getY();
                        float width = endPdfBDO.getX() - x + t.getWidth();
                        float height = t.getHeight();
                        int curPage = t.getCurPage();
                        PdfContentByte canvas = stamper.getOverContent(curPage);
                        canvas.saveState();
                        canvas.setColorFill(BaseColor.WHITE);
                        // 以左下点为原点,x轴的值,y轴的值,总宽度,总高度:
                        //开始覆盖内容,实际操作位置
                        canvas.rectangle(x, y, width, height*1.3);
                        canvas.fill();
                        canvas.setColorFill(BaseColor.BLACK);
                        //开始写入文本
                        canvas.beginText();
                        BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
                        Font font = new Font(bf,height,Font.BOLD);
                        //设置字体和大小
                        canvas.setFontAndSize(font.getBaseFont(), height);
                        //设置字体的输出位置
                        canvas.setTextMatrix(x, y+3);
                        //要输出的text
                        canvas.showText(replace) ;
                        canvas.endText();
                        canvas.fill();
                        canvas.restoreState();
                        success=true;
                    }
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (stamper != null)
                    stamper.close();
                if (pdfReader != null)
                    pdfReader.close();
            }
            return success;
        }
        /**
         * @Description : 功能说明
         * 由于部分pdf文字会被分割
         * 采用如下文字分割方式,寻找距离最近的字符再进行匹配
         * 匹配后对该字符串后面的文字进行脱敏
        */
    
        public static boolean compareTextAfterKey(String src, String dest, String keyword,float maxDistance,String replace) throws Exception {
            boolean success=false;
            PdfReader pdfReader = null;
            PdfStamper stamper = null;
            try {
                pdfReader = new PdfReader(src);
                stamper = new PdfStamper(pdfReader, new FileOutputStream(dest));
                char[] chars = keyword.toCharArray();
                HashMap<String, List<PdfBDO>> textMap = new HashMap<>();
                for (char c: chars) {
                    String s = String.valueOf(c);
                    List<PdfBDO> textLineModes = renderText(pdfReader, s);
                    textMap.put(s,textLineModes);
                }
                List<PdfBDO> textLineModes = textMap.get(String.valueOf(chars[0]));
                Map<Float,Float> mapY = new HashMap<>();
                for (PdfBDO textLineMode: textLineModes) {
                    //根据首字符 找出同一行的文字
                    float y = textLineMode.getY();
                    float x = textLineMode.getX();
                    mapY.put(y,x);
                }
                Set<Float> floats = mapY.keySet();
                Iterator<Float> iterator = floats.iterator();
                HashMap<Float, Map<String,PdfBDO>> keyYMap = new HashMap<>();
                while (iterator.hasNext()){
                    Float y = iterator.next();
                    Float x = mapY.get(y);
                    HashMap<String, PdfBDO> tMap = new HashMap<>();
                    for (int i = 0; i < chars.length; i++) {
                        char c=chars[i];
                        List<PdfBDO> textLineModes1 = textMap.get(String.valueOf(c));
                        for (PdfBDO t : textLineModes1) {
                            if (t.getY()==y){
                                //判断两文字之间的具体是否符合要求
                                float x1 = t.getX();
                                float absoluteValue = getAbsoluteValue(x1, x);
                                if (absoluteValue<maxDistance){
                                    Object o = tMap.get(String.valueOf(c));
                                    if (o!=null){
                                        PdfBDO o1 = (PdfBDO) o;
                                        if (getAbsoluteValue(o1.getX(),x)>absoluteValue){
                                            tMap.put(String.valueOf(c),t);
                                        }
                                    }
                                    else {
                                        tMap.put(String.valueOf(c),t);
                                    }
                                }
                            }
                        }
                    }
                    keyYMap.put(y,tMap);
                }
                Set<Float> keySet = keyYMap.keySet();
                Iterator<Float> iterator1 = keySet.iterator();
                while (iterator1.hasNext()){
                    Float next = iterator1.next();
                    Map<String,PdfBDO> map = keyYMap.get(next);
                    if (map.size()==chars.length){
                        PdfBDO t = map.get(String.valueOf(chars[chars.length-1]));
                        float x = t.getX();
                        float y = t.getY();
                        float width = t.getWidth();
                        float height = t.getHeight();
                        int curPage = t.getCurPage();
                        PdfContentByte canvas = stamper.getOverContent(curPage);
                        canvas.saveState();
                        canvas.setColorFill(BaseColor.WHITE);
                        // 以左下点为原点,x轴的值,y轴的值,总宽度,总高度:
                        //开始覆盖内容,实际操作位置
                        canvas.rectangle(x+width, y, 100, height*1.3);
                        canvas.fill();
                        canvas.setColorFill(BaseColor.BLACK);
                        //开始写入文本
                        canvas.beginText();
                        BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
                        Font font = new Font(bf,height,Font.BOLD);
                        //设置字体和大小
                        canvas.setFontAndSize(font.getBaseFont(), height);
                        //设置字体的输出位置
                        canvas.setTextMatrix(x+width, y+3);
                        //要输出的text
                        canvas.showText(replace) ;
                        canvas.endText();
                        canvas.fill();
                        canvas.restoreState();
                        success=true;
                    }
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (stamper != null)
                    stamper.close();
                if (pdfReader != null)
                    pdfReader.close();
            }
            return success;
        }
    
    
        /**
         * 根据关键字,在其后进行脱敏
         * @Author : mabo
         */
        public static boolean manipulatePdfAfterKey(String src, String dest, List<String> keywords,String replace ) throws Exception {
            boolean success=false;
            PdfReader pdfReader = null;
            PdfStamper stamper = null;
            try {
                pdfReader = new PdfReader(src);
                List<PdfBDO> list = renderText(pdfReader, keywords);
                stamper = new PdfStamper(pdfReader, new FileOutputStream(dest));
                if (list != null) {
                    for (int i = 0; i < list.size(); i++) {
                        PdfBDO mode = list.get(i);
    
                        PdfContentByte canvas = stamper.getOverContent(mode.getCurPage());
                        canvas.saveState();
                        canvas.setColorFill(BaseColor.WHITE);
                        // 以左下点为原点,x轴的值,y轴的值,总宽度,总高度:
                        //开始覆盖内容,实际操作位置
                        canvas.rectangle(mode.getX()+ mode.getWidth(), mode.getY(), 100, mode.getHeight()*1.3);
                        canvas.fill();
                        canvas.setColorFill(BaseColor.BLACK);
                        //开始写入文本
                        canvas.beginText();
                        BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
                        Font font = new Font(bf,mode.getHeight(),Font.BOLD);
                        //设置字体和大小
                        canvas.setFontAndSize(font.getBaseFont(), mode.getHeight());
                        //设置字体的输出位置
                        canvas.setTextMatrix(mode.getX()+mode.getWidth()+10, mode.getY()+3);
                        //要输出的text
                        canvas.showText(replace) ;
                        canvas.endText();
                        canvas.fill();
                        canvas.restoreState();
                        success=true;
                    }
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (stamper != null)
                    stamper.close();
                if (pdfReader != null)
                    pdfReader.close();
            }
            return success;
        }
    
    
    
        /**
         * @Description : 匹配pdf中的文字,进行替换
         * @Author : mabo
         */
        public static boolean manipulatePdf(String src, String dest, List<String> keywords,String replace ) throws Exception {
            boolean success=false;
            PdfReader pdfReader = null;
            PdfStamper stamper = null;
            try {
                pdfReader = new PdfReader(src);
                List<PdfBDO> list = renderText(pdfReader, keywords);
                stamper = new PdfStamper(pdfReader, new FileOutputStream(dest));
                if (list != null) {
                    for (int i = 0; i < list.size(); i++) {
                        PdfBDO mode = list.get(i);
    
                        PdfContentByte canvas = stamper.getOverContent(mode.getCurPage());
                        canvas.saveState();
                        canvas.setColorFill(BaseColor.WHITE);
                        // 以左下点为原点,x轴的值,y轴的值,总宽度,总高度:
                        // canvas.rectangle(mode.getX() - 1, mode.getY(),
                        // mode.getWidth() + 2, mode.getHeight());
                        //开始覆盖内容,实际操作位置
                        canvas.rectangle(mode.getX(), mode.getY(), mode.getWidth(), mode.getHeight()*1.3);
                        canvas.fill();
                        canvas.setColorFill(BaseColor.BLACK);
                        //开始写入文本
                        canvas.beginText();
                        BaseFont bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.EMBEDDED);
                        Font font = new Font(bf,mode.getHeight(),Font.BOLD);
                        //设置字体和大小
                        canvas.setFontAndSize(font.getBaseFont(), mode.getHeight());
                        //设置字体的输出位置
                        canvas.setTextMatrix(mode.getX(), mode.getY()+3);
                        //要输出的text
                        canvas.showText(replace) ;
                        canvas.endText();
                        canvas.fill();
                        canvas.restoreState();
                        success=true;
                    }
                }
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (stamper != null)
                    stamper.close();
                if (pdfReader != null)
                    pdfReader.close();
            }
            return success;
        }
        public static List<PdfBDO> renderText(PdfReader pdfReader, final List<String> keywords) {
            final List<PdfBDO> list = new ArrayList<PdfBDO>();
            try {
                PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);
                int pageNum = pdfReader.getNumberOfPages();
                for (int i = 1; i <= pageNum; i++) {
                    final int curPage = i;
    
                    pdfReaderContentParser.processContent(curPage, new RenderListener() {
                        public void renderText(TextRenderInfo textRenderInfo) {
                            String text = textRenderInfo.getText();
                            System.out.println(text);
                            if (text != null) {
                                for (int j = 0; j < keywords.size(); j++) {
                                    String keyword = keywords.get(j);
                                    if (text.contains(keyword)) {
                                        com.itextpdf.awt.geom.Rectangle2D.Float bound = textRenderInfo.getBaseline()
                                                .getBoundingRectange();
                                        PdfBDO lineMode = new PdfBDO();
                                        lineMode.setHeight(bound.height == 0 ? PdfBDO.defaultHeight : bound.height);
                                        lineMode.setWidth(bound.width);
                                        lineMode.setX(bound.x);
                                        lineMode.setY(bound.y - PdfBDO.fixHeight);
                                        lineMode.setCurPage(curPage);
                                        list.add(lineMode);
                                    }
                                }
                            }
                        }
    
                        public void renderImage(ImageRenderInfo arg0) {
                        }
    
                        public void endTextBlock() {
    
                        }
    
                        public void beginTextBlock() {
                        }
                    });
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return list;
        }
    
        public static List<PdfBDO> renderText(PdfReader pdfReader, String keyword) {
            final List<PdfBDO> list = new ArrayList<PdfBDO>();
            try {
                PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);
                int pageNum = pdfReader.getNumberOfPages();
                for (int i = 1; i <= pageNum; i++) {
                    final int curPage = i;
                    pdfReaderContentParser.processContent(curPage, new RenderListener() {
                        public void renderText(TextRenderInfo textRenderInfo) {
                            String text = textRenderInfo.getText();
                            if (text != null) {
                                if (text.contains(keyword)) {
                                    com.itextpdf.awt.geom.Rectangle2D.Float bound = textRenderInfo.getBaseline()
                                            .getBoundingRectange();
                                    PdfBDO lineMode = new PdfBDO();
                                    lineMode.setHeight(bound.height == 0 ? PdfBDO.defaultHeight : bound.height);
                                    lineMode.setWidth(bound.width);
                                    lineMode.setX(bound.x);
                                    lineMode.setY(bound.y - PdfBDO.fixHeight);
                                    lineMode.setCurPage(curPage);
                                    list.add(lineMode);
                                }
                            }
                        }
    
                        public void renderImage(ImageRenderInfo arg0) {
                        }
    
                        public void endTextBlock() {
    
                        }
    
                        public void beginTextBlock() {
                        }
                    });
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            return list;
        }
        public static float getAbsoluteValue(float f1, float f2){
            if (f1>f2){
                return f1-f2;
            }else {
                return f2-f1;
            }
        }
    
    
        public static File outputStream2File (ByteArrayOutputStream out, File file ) throws IOException {
            FileOutputStream fileOutputStream = new FileOutputStream(file.getName());
            fileOutputStream.write(out.toByteArray());
            return file;
        }
        public File inputStream2File (InputStream in ,File file ) throws IOException {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            int ch = 0;
            while ((ch = in.read()) != -1) {
                out.write(ch);
            }
            outputStream2File(out,file);
            return file;
        }
        public static InputStream File2InputStream (File file ) throws IOException {
            InputStream inputStream = new FileInputStream(file);
            return inputStream;
        }
    
        /**
         *
         * @param destPath 生成pdf文件的路劲
         * @param images	需要转换的图片路径的数组
         *                  imagesToPdf("G:/test333.pdf",new String[]{"G:/test.jpg"});
         * @throws IOException
         * @throws DocumentException
         */
        public static void imagesToPdf(String destPath, String[] images)
                throws IOException, DocumentException {
            // 第一步:创建一个document对象。
            Document document = new Document();
            document.setMargins(0, 0, 0, 0);
    
            // 第二步:
            // 创建一个PdfWriter实例,
    
            getInstance(document,new FileOutputStream(destPath));
    
            // 第三步:打开文档。
            document.open();
    
            // 第四步:在文档中增加图片。
            int len = images.length;
            for (int i = 0; i < len; i++) {
                Image img = Image.getInstance(images[i]);
                img.setAlignment(Image.ALIGN_CENTER);
                //根据图片大小设置页面,一定要先设置页面,再newPage(),否则无效
                document.setPageSize(new Rectangle(img.getWidth(), img.getHeight()));
                document.newPage();
                document.add(img);
            }
    
            // 第五步:关闭文档。
            document.close();
    
        }
    
        /**
         * 将PDF文件转换成多张图片
         *
         * @param pdfFile PDF源文件
         * @return 图片字节数组列表
         */
        public static void pdf2images(File pdfFile) throws Exception {
            String name = pdfFile.getName();
            String[] split = name.split("\\.");
            //加载PDF
            PDDocument pdDocument = PDDocument.load(pdfFile);
            //创建PDF渲染器
            PDFRenderer renderer = new PDFRenderer(pdDocument);
            int pages = pdDocument.getNumberOfPages();
            for (int i = 0; i < pages; i++) {
                ByteArrayOutputStream output = new ByteArrayOutputStream();
                //将PDF的每一页渲染成一张图片
                BufferedImage image = renderer.renderImage(i);
                ImageIO.write(image, "png", output);
                FileOutputStream fileOutputStream = new FileOutputStream("G:/"+split[0]+i+".png");
                fileOutputStream.write(output.toByteArray());
                fileOutputStream.flush();;
                fileOutputStream.close();
            }
            pdDocument.close();
        }
    }
    
    

    实体

    
    
    public class PdfBDO {
        public static final float defaultHeight = 14;
        public static final float fixHeight = 4;
    
        private int curPage = 1;
        private float height = 0;
        private float width = 0;
        private float x = 0;
        private float y = 0;
    
        public int getCurPage() {
            return curPage;
        }
    
        public void setCurPage(int curPage) {
            this.curPage = curPage;
        }
    
        public float getHeight() {
            return height;
        }
    
        public void setHeight(float height) {
            this.height = height;
        }
    
        public float getWidth() {
            return width;
        }
    
        public void setWidth(float width) {
            this.width = width;
        }
    
        public float getX() {
            return x;
        }
    
        public void setX(float x) {
            this.x = x;
        }
    
        public float getY() {
            return y;
        }
    
        public void setY(float y) {
            this.y = y;
        }
    
    }
    
    
    
    

    总结

    如何使pdf图片,可以结合OCR识别为pdf文字,再使用改工具类即可。

    JAVA 基础知识点
    什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”?
    Java虚拟机是一个可以执行Java字节码的虚拟机进程。Java源文件被编译成能被Java虚拟机执行的字节码文件。
    Java被设计成允许应用程序可以运行在任意的平台,而不需要程序员为每一个平台单独重写或者是重新编译。Java虚拟机让这个变成可能,因为它知道底层硬件平台的指令长度和其它特性。

    什么是J2EE?JVM?JRE?JDK?
    (1)J2EE:是为开发企业环境下的应用程序提供的一套解决方案,该技术体系中包含的技术如Servlet、Jsp等,主要针对Web应用程序开发。
    (2)JVM:JVM是java虚拟机(JVM Java Virtual Machine),java程序需要运行在虚拟机上,不同平台有自己的虚拟机,因此java语言可以跨平台。
    (3)JRE:包括Java虚拟机(JVM Java Virtual Machine)和Java程序所需的核心类库等如果想要运行一个开发好的Java程序,计算机中只需要安装JRE即可。JRE:JVM+类库。
    (4)JDK:JDK是提供给Java开发人员使用的,其中包含了java的开发工具,也包括了JRE。所以安装了JDK,就不用在单独安装JRE了。其中的开发工具:编译工具(javac.exe) 打包工具(jar.exe)等。JDK:JRE+JAVA的开发工具。

    static关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static方法?
    “static”关键字表明一个成员变量或者是成员方法可以在没有所属的类的实例变量的情况下被访问。

    Java中static方法不能被覆盖,因为方法覆盖是基于运行时动态绑定的,而static方法是编译时静态绑定的。static方法跟类的任何实例都不相关,所以概念上不适用。

    Java中也不可以覆盖private方法,因为private修饰的变量和方法只能在当前类中使用,如果是其它类继承当前类,是不能访问到private变量或方法的,当然也不能覆盖。

    是否可以在static环境中访问非static变量?
    static变量在Java中是属于类的,它在所有的实例中的值是一样的,当类被Java虚拟机载入的时候,会对static变量进行初始化。如果你的代码尝试不用实例来访问非static的变量,编译器会报错,因为这些变量还没有被创建出来,还没有跟任何实例关联上。

    Java支持的数据类型有哪些?什么是自动拆装箱?
    Java语言支持的8种基本数据类型是:

    boolean

    byte、char

    short、int

    long、float、double

    自动装箱是Java编译器在基本数据类型和对应的对象包装类型之间做的一个转化。比如:把int转化成integer,double转化成Double,等等。反之就是自动拆箱。

    面向对象的三大特性(继承、封装、多态)
    继承、封装、多态

    什么是继承?
    ①继承是面向对象程序设计能够提高软件开发效率的重要原因之一。
    ②继承是具有传递性的,就像现实中孙子不仅长得像爸爸而且还像他爷爷。
    ③继承来的属性和方法是隐式的,也就是在本类里面是看不见的。
    ④一个类只能有一个父类,也就是类只能是单继承。
    ⑤一个接口可以有多个父类,也就是接口可以是多继承。
    实际项目开发中,一个类继承于另一个类,那么前者就是后者的子类,反则反之。

    什么是封装?
    对象数据和操作该对象的指令都是对象自身的一部分,能够实现尽可能对外部隐藏数据。
    实际项目开发中,使用封装最多的就是实体类,常常和JavaBean(类必须是具体的和公共的,并且具有无参数的构造器)一起使用。
    那么,实体类有那些东西呢?
    答:私有的成员变量、无参数的构造器、有参数的构造器、setter和getters方法、重写tostring方法、重写hashCode和equals方法。

    什么是多态?
    ①多态就是对象拥有多种形态:引用多态和方法多态。
    ②引用多态:父类的引用可以指向本类对象、父类的引用可以指向子类的对象。
    ③方法多态:创建本类对象时,调用的方法为本类的方法;创建子类对象时,调用的方法为子类重写的方法或者继承的方法。
    ④存在多态的必要条件:继承、重写。
    ⑤多态的作用是消除类型之间的耦合关系。
    在实际项目开发中,A类继承B类,如果在A类中不重写B类的方法的时候,输出的仍旧是B类方法里面的信息(B b=new A());如果在A类中重写B类的方法的时候,输出的是A类方法里面的信息(B b=new A())。

    java为什么不支持多继承?
    1.若子类继承的父类中拥有相同的成员变量,子类在引用该变量时将无法判别使用哪个父类的成员变量。
    2.若一个子类继承的多个父类拥有相同方法,同时子类并未覆盖该方法(若覆盖,则直接使用子类中该方法),那么调用该方法时将无法确定调用哪个父类的方法。

    Java 中覆盖和重载是什么意思?
    解析:覆盖和重载是比较重要的基础知识点,并且容易混淆,所以面试中常见。
    答:覆盖(Overide)是指子类对父类方法的一种重写,只能比父类抛出更少的异常,访问权限不能比父类的小。
    被覆盖的方法不能是 private 的,否则只是在子类中重新定义了一个方法;

    重载(Overload)表示同一个类中可以有多个名称相同的方法,但这些方法的参数列表各不相同。

    面试官: 那么构成重载的条件有哪些?

    答:参数类型不同、参数个数不同、参数顺序不同。

    面试官: 函数的返回值不同可以构成重载吗?为什么?

    答:不可以,因为 Java 中调用函数并不需要强制赋值。举例如下:
    如下两个方法:

    void f(){}
    int f(){ return 1;}
    1
    2
    只要编译器可以根据语境明确判断出语义,比如在 int x = f();中,那么的确可以据此区分重载方法。不过, 有时你并不关心方法的返回值,你想要的是方法调用的其他效果 (这常被称为 “为了副作用而调用”),这时你可能会调用方法而忽略其返回值,所以如果像下面的调用:

    fun();

    此时 Java 如何才能判断调用的是哪一个 f() 呢?别人如何理解这种代码呢?所以,根据方法返回值来区分重载方法是行不通的。

    重定向和转发的区别。
    1、重定向是两次请求,转发是一次请求,因此转发的速度要快于重定向
    2、重定向之后地址栏上的地址会发生变化,变化成第二次请求的地址,转发之后地址栏上的地址不会变化,还是第一次请求的地址
    3、转发是服务器行为,重定向是客户端行为。重定向时浏览器上的网址改变 ,转发是浏览器上的网址不变
    4、重定向是两次request,转发只有一次请求
    5、重定向时的网址可以是任何网址,转发的网址必须是本站点的网址

    抽象类和接口的区别有哪些?
    答:
    抽象类中可以没有抽象方法;接口中的方法必须是抽象方法;
    抽象类中可以有普通的成员变量;接口中的变量必须是 static final 类型的,必须被初始化 , 接口中只有常量,没有变量。
    抽象类只能单继承,接口可以继承多个父接口;
    Java8 中接口中会有 default 方法,即方法可以被实现。

    面试官:抽象类和接口如何选择?
    答:
    如果要创建不带任何方法定义和成员变量的基类,那么就应该选择接口而不是抽象类。
    如果知道某个类应该是基类,那么第一个选择的应该是让它成为一个接口,只有在必须要有方法定义和成员变量的时候,才应该选择抽象类。因为抽象类中允许存在一个或多个被具体实现的方法,只要方法没有被全部实现该类就仍是抽象类。

    展开全文
  • 批量更改PDF内容的日期和时间: PDF批量替换文字器还可以让您很方便的更新PDF文件的日期和时间。在"查找文字"栏输入旧的日期和时间(当然要和PDF文件的日期和时间文字一致),然后在"替换为"栏输入最新...
  • 添加页面插入页面删除页面在PDF之间复制页面绘制文字绘制图像绘制PDF页面绘制矢量图形绘制SVG路径测量文字的宽度和高度嵌入字体(支持UTF-8和UTF-16字符集) 设置文档元数据阅读文档元数据设置查看器首选项阅读观众...
  • Html解决pdf导出出现的中文数字等不换行等问题, 已重新修改了Jar包, 重新打包好了,可直接使用,亲测好用.
  • 如何修改PDF中的图片上的文字

    千次阅读 2020-07-08 15:08:04
    很多PDF格式的文档内容既包含文字也有一些图片,对于文字修改相对简单一些,如果需要修改图片上的文字应该怎么操作呢? 首先用极速PDF编辑器打开我们需要修改PDF文件后,选择工具栏的“对象工具”,接着在图片...

    很多PDF格式的文档内容既包含文字也有一些图片,对于文字的修改相对简单一些,如果需要修改图片上的文字应该怎么操作呢?

    首先用极速PDF编辑器打开我们需要修改的PDF文件后,选择工具栏中的“对象工具”,接着在图片处右击并选择“图像”—“提取到文件”;
    在这里插入图片描述

    然后将图片以PNG或JPG格式保存到电脑桌面。
    在这里插入图片描述

    接着我们可以直接将图片拖动到PS工具中对文字进行相应的修改后保存;
    在这里插入图片描述

    然后回到PDF编辑器页面,同样还是选择对象工具后,在图片处右击并选择“图像”中的“替换现有图像”并用上一步中修改后的图片替换即可。
    在这里插入图片描述

    PS:如需修改PDF文档中的文字部分,可直接选择“文本工具”后,在文本段落中修改即可。
    在这里插入图片描述

    所有修改完成后,点击右上角“文件”中的保存功能进行存储就可以啦。
    在这里插入图片描述

    展开全文
  • PDF如何编辑,怎么修改PDF中文字

    万次阅读 2018-12-10 13:32:06
    在很多的时候,大家都会使用到PDF文件,不管是在学习还是在工作,都会使用到PDF文件,那么,对于PDF文件的修改,则是需要使用到PDF编辑软件的,那么,PDF如何编辑,怎么修改PDF中文字呢,是不是有很多的小伙伴...

           在很多的时候,大家都会使用到PDF文件,不管是在学习中还是在工作中,都会使用到PDF文件,那么,对于PDF文件的修改,则是需要使用到PDF编辑软件的,那么,PDF如何编辑,怎么修改PDF中的文字呢,是不是有很多的小伙伴都想知道应该怎么做呢,那就可以看看下面的文章,说不定就知道了哦。

                            

           1.打开运行迅捷PDF编辑器,在编辑器中打开需要修改的PDF文件。

                            

            2.打开文件后,选择编辑器中菜单栏里的工具,在工具中选择内容编辑,内容编辑中有内容编辑工具以及添加工具,点击内容编辑工具。

                             

            3.点击内容编辑工具后,在内容编辑工具中有全部内容,仅文本,仅图像以及仅形状,点击仅文本,然后鼠标双击选中文本内容,点击鼠标右键,选择文本样式就可以了哦。

                            

            4.文件中的图片修改,点击内容编辑工具中的仅图像,然后选中文件中的图片,点击鼠标右键,选择编辑图像或者是替换图像即可。

                            

            5.修改完文件后,记得保存好文件哦,点击菜单栏中的文件,保存或者另存为。

                             

            PDF如何编辑,怎么修改PDF中的文字小编就和大家分享完了,不知道大家有没有学会,没有学会的小伙伴可以看看上面的文章,PDF编辑的小技巧有很多,在修改文件的时候使用PDF编辑工具也是很方便的,小编还会继续和大家分享PDF编辑的小技巧,希望这些小技巧可以帮助到大家哦。

    展开全文
  • 如何修改PDF文件内的文字的字体和颜色?可能在大多数人的印象里面,PDF文件是不能修改的,但是随着PDF编辑器的不断更新,已经有很多PDF编辑器可以自由修改PDF的文本和图片了,但是很多人还是经常被骗。网上有很多打...
  • JAVA替换PDF文字

    千次阅读 2021-02-12 12:45:55
    1 importcom.itextpdf.text.BaseColor;2 importcom.itextpdf.text.Font;3 importcom.itextpdf.text.Rectangle;4 importcom.itextpdf.text.pdf.BaseFont;5 importcom.itextpdf.text.pdf.PdfContentByte;6 importcom.i...
  • xhtmlrenderer 进行HTML转PDF修改了core-renderer-R8的源码,兼容英文换行,且保持对英文单词完整性,亲测可用。
  • 想要在PDF文件添加文字文本框,那么就需要使用到捷速PDF编辑器进行文字文本框添加操作,这是一款功能强大的PDF编辑软件,利用这款软件可以完成绝大多数PDF文件编辑操作,而且这款软件操作简单,只需要简单几步即可...
  • 怎么修改PDF文件的图片以及文字

    千次阅读 2019-05-10 14:05:59
    PDF文件的修改是需要借助到PDF编辑器的,而在使用PDF文件的过程,往往对于文件的怎么进行修改,很多的小伙伴却不知道,那么,今天小编就来和大家说说PDF文件的文件内容修改,一起看看吧。 使用工具:迅捷PDF...
  • 如何更改pyPDF 2模块的字体。在我试过print(help(canvas.Canvas))我尝试了initialFontName = None和{}但我的文字没有改变。另外,我使用raspberry pi和raspbian操作系统来完成这个任务。在这是我的密码can = ...
  • Java 替换PDF中的字体

    2022-03-07 10:24:59
    下面,以Java代码展示如何来替换PDF中的已有字体,包括: 替换所有字体 替换指定字体 引入jar Maven程序配置pom.xml: <repositories> <repository> <id>com.e-iceblue</id>
  • 项目选择管理NuGet程序包,搜索iTextSharp安装即可 Demo实现ITextSharp修改文字排列方向横向竖向
  • 捷速PDF编辑器修改PDF文件文字的教程.docx
  • 本文档描述了数字签名在PDF文档结构的设计以及PDF语言对签名相关特性的支持。Adobe® Reader®和Acrobat®已经实现了PDF的所有特性,基于公钥基础设施(PKI)的技术,它提供了全面的数字签名身份验证功能,第三方...
  • PDF_编辑允许替换 PDF 文件的文本的 PHP 类此类允许在已创建的 PDF 编辑流类型对象的文本,它与 TCPDF 解析器结合使用(参见 TCPDF 项目 )。 目前,该类是为一个非常特定的目的而构建的,并已上传到 GITHUB ...
  • 无论修改字词、段落还是整个页面,Infix 软件都能轻松胜任。Infix 是唯一帮您打理版面格式的 PDF 编辑器,可在您编辑后自动重排文本及设置文本格式,使版面获得良好的视觉效果。将编辑好的文件保存后,甚至都看不出...
  • 1、core-renderer.jar该jar包修改过中文不换行问题 public static String getConversionHtmlCode(String linkcss,String htmlCode,String title){ String css = ""; css +="<style>"; css +="table{"; ...
  • java 修改pdf

    千次阅读 2021-03-07 22:26:01
    该楼层疑似违规已被系统折叠隐藏此楼查看此楼Java操作pdf原理就是覆盖原来的内容!这是我总结百度的代码,自己写的几个方法。jar包依赖:com.itextpdfitextpdf5.5.11com.itextpdfitext-asian5.2.0代码:import java....
  • 怎样修改PDF中的文本的字体

    千次阅读 2021-05-20 17:01:05
    PDF是一种比较难修改的文件格式,并不像Word等office文档直接打开就能随意编辑,但如果需要将PDF中的某些文字的字体进行修改要怎么做呢? 虽然PDF不易修改,但使用PDF编辑器就能直接进行编辑。首先我们打开极速PDF...
  • 经过大牛修改后的core-renderer.jar,当把HTML转化成PDF时支持table的td的中文、英文和数字自动换行,table必须添加样式table-layout:fixed;word-break:break-strict;
  • 解决HTML转pdf 中文、数字、英文不能换行的问题,修改的源码包 重新计算了右边距
  • 如何在PDF上添加文字

    千次阅读 2021-03-09 07:04:12
    傲软PDF编辑傲软PDF编辑是一款专业的PDF编辑器,适用于Windows/Mac系统,使用它可以轻松编辑PDF文件,例如在PDF上添加文字,插入图片,绘制标记等,是一款简单实用的PDF工具。如何使用傲软PDF编辑给PDF添加文字呢?...
  • itext替换PDF的原理就是找到要替换的文字,然后计算他的位置,在哪个位置上生成覆盖层,然后在覆盖层上写内容。从网上看到的自动计算PDF中文的位置方法。public class PdfConversion {// 定义关键字private static...
  • 工作可能会涉及处理pdf文件,PyPDF2就是这样一个库, 使用它可以轻松的处理pdf文件,它提供了读、写、分割、合并、文件转换等多种操作。官方地址:http://mstamy2.github.io/PyPDF2/安装1. RPM式系统(Redhat、...
  • 想要打开pdf文件编辑、修改,无疑需要编辑工具的帮助,这就肯定要借助pdf编辑器来完成了,那么如何利用编辑器来修改pdf文件的字体大小呢?下面小编就通过迅捷pdf编辑器来向大家详细的讲解。附上软件链接地址:pdf...
  • 1、解决HTML转pdf 中文、数字、英文不能换行的问题,修改的源码包 重新计算了右边距。 2、html转pdf 参考我的另外一篇博文https://blog.csdn.net/qq_38616723/article/details/125188407?spm=1001.2014.3001.5502

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 90,272
精华内容 36,108
关键字:

修改pdf中的文字