首页 > 其他分享 >PDF相关操作

PDF相关操作

时间:2024-02-29 19:46:47浏览次数:16  
标签:document int text builder under new PDF 相关 操作

PDF相关操作

  1. word转pdf

        public static void wordConvertPdf(File targetFile, File file) throws Exception {
            FileOutputStream os = new FileOutputStream(file);
    		// Address是将要被转化的word文档
            Document doc = new Document(targetFile.getAbsolutePath()); 
            DocumentBuilder builder = new DocumentBuilder(doc);
            //文档主体内容设置段后和行距
            builder.moveToDocumentStart();
            builder.getParagraphFormat().setLeftIndent(12);
            builder.getParagraphFormat().setSpaceAfter(0);
            builder.moveToHeaderFooter(HeaderFooterType.HEADER_PRIMARY);
            builder.getParagraphFormat().setLineSpacing(12);
            builder.getParagraphFormat().setSpaceAfter(0);
            builder.moveToHeaderFooter(HeaderFooterType.FOOTER_PRIMARY);
            builder.getParagraphFormat().setLineSpacing(12);
            builder.getParagraphFormat().setSpaceAfter(0);
            builder.moveToDocumentStart();
            doc.save(os, SaveFormat.PDF);
            os.close();
        }
    
  2. 添加图片

       private String issuedAndStamped(File file) throws Exception {
            String fileUrl = null;
            String baseUrl = Constants.docXmlTemplatePath;
            PDDocument document = null;
    
            try {
                // 加载PDF文档
                document = PDDocument.load(file);
    
                // 加载图片
                PDImageXObject logo = PDImageXObject.createFromFile(path + "logo_fsda.jpg", document);
    
                Map<String, Integer> logoMap = getImageScale(logo, 60f);
                //首页插入图片
                // 获取第一页
                PDPage firstPage = document.getPage(0);
                // 在第一页的合适位置插入图片
                PDPageContentStream contentStream = new PDPageContentStream(document, firstPage, PDPageContentStream.AppendMode.APPEND, true, true);
         		contentStream.close();
    
    
                Map<String, Double> signMap = new HashMap<>();
                PDFTextStripper stripper = new PDFTextStripper() {
                    @Override
                    protected void writeString(String string, List<TextPosition> textPositions) throws IOException {
                        //System.out.println("新的一页。。。。。。");
                        if (string.contains("编制:")||string.contains("编制:")) {
                            boolean b = false;
                            for (TextPosition text : textPositions) {
                                String textValue = text.getUnicode();
                                if (Objects.equals("制", textValue)) {
                                    b = true;
                                }
                                if ((Objects.equals(":", textValue) || Objects.equals(":", textValue)) && b) {
                                    Rectangle2D.Float boundingBox = calculateBoundingBox(text);
                                    //System.out.println("Text: " + textValue);
                                    //System.out.println("(编制)Position: x=" + boundingBox.getX() + ", y=" + boundingBox.getY());
                                    signMap.put("bzrx", boundingBox.getX());
                                    signMap.put("bzry", boundingBox.getY());
                                    break;
                                }
    
                            }
                        }
                    }
                };
    
                stripper.setSortByPosition(true);
                Writer dummy = new OutputStreamWriter(new ByteArrayOutputStream());
                // 遍历每一页
                for (PDPage page : document.getPages()) {
                    // 创建内容流
                    contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);
                    // 在页面上绘制图片
                    contentStream.drawImage(logo, 500, 775, logoMap.get("scaledWidth"), logoMap.get("scaledHeight"));
                    // 关闭内容流
                    contentStream.close();
                }
                // 保存PDF文档
                fileUrl = baseUrl + new Date().getTime() + ".pdf";
                File f = new File(fileUrl);
                if (!f.getParentFile().exists()) {
                    f.getParentFile().mkdirs();
                }
                document.save(fileUrl);
    
                // 关闭文档
                document.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            return fileUrl;
        }
    	private static Rectangle2D.Float calculateBoundingBox(TextPosition text) {
            float x = text.getXDirAdj();
            float y = text.getYDirAdj();
            float width = text.getWidthDirAdj();
            float height = text.getHeightDir();
            return new Rectangle2D.Float(x, y, width, height);
        }
    
        private static Map<String, Integer> getImageScale(PDImageXObject image, float v) {
            // 获取图片原始的宽度和高度
            int originalWidth = image.getWidth();
            int originalHeight = image.getHeight();
    
            // 计算缩放比例
            float scaleX = v / originalWidth;
            float scaleY = v / originalHeight;
            float scale = Math.min(scaleX, scaleY);
    
            // 计算缩放后的宽度和高度
            int scaledWidth = Math.round(originalWidth * scale);
            int scaledHeight = Math.round(originalHeight * scale);
            Map<String, Integer> map = new HashMap<>();
            map.put("scaledWidth", scaledWidth);
            map.put("scaledHeight", scaledHeight);
            return map;
        }
    
    
  3. 添加水印

        private void waterMark(String inputPdfPath, String outputPdfPath) {
            try {
                String watermarkText = "FSDA";
                int interval = -5;
                PdfReader reader = new PdfReader(inputPdfPath);
                System.out.println("读取PDF文件模板完了=============================");
                PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputPdfPath));
    
                BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
    
                com.itextpdf.text.Rectangle pageRect = null;
                PdfGState gs = new PdfGState();
                gs.setFillOpacity(0.07f);  //透明度
                gs.setStrokeOpacity(0.07f);
                int total = reader.getNumberOfPages() + 1;
    
                JLabel label = new JLabel();
                FontMetrics metrics;
                int textH = 0;
                int textW = 0;
                label.setText(watermarkText);
                metrics = label.getFontMetrics(label.getFont());
                textH = metrics.getHeight();
                textW = metrics.stringWidth(label.getText());
    
                PdfContentByte under;
                for (int i = 1; i < total; i++) {
                    pageRect = reader.getPageSizeWithRotation(i);
                    under = stamper.getOverContent(i);
                    under.saveState();
                    under.setGState(gs);
                    under.beginText();
                    under.setFontAndSize(base, 10);
                    under.setTextRenderingMode(PdfContentByte.TEXT_RENDER_MODE_FILL_STROKE);
                    //你可以随心所欲的改你自己想要的角度   水印文字成30度角倾斜
                    for (int height = interval*2 + textH; height < pageRect.getHeight(); height = height + textH * 8) {
                        for (int width = interval + textW; width < pageRect.getWidth() + textW; width = (int) (width + (textW * 4))) {
                            under.showTextAligned(Element.ALIGN_LEFT, watermarkText, width - textW, height - textH, 20);
                        }
                    }
    
                    // 添加水印文字
                    under.endText();
                }
                System.out.println("PDF文件水印打印成功!路径:" + outputPdfPath);
                //说三遍
                //一定不要忘记关闭流
                //一定不要忘记关闭流
                //一定不要忘记关闭流
                stamper.close();
                reader.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    

标签:document,int,text,builder,under,new,PDF,相关,操作
From: https://www.cnblogs.com/mengzhao/p/18045279/pdf-related-operation-z28t2ep

相关文章

  • 9操作系统和应用的关系
    监控程序的主要功能是程序的加载和运行。,调用操作系统的功能叫系统调用。监控程序也可以说是操作系统的原型。利用计算机运行程序大部分都是为了提高效率。我们要意识到操作系统的存在。,应用的可知性文件是指计算机的CPU可以直接解释并运行的本地代码。操作系统这个运行环境下......
  • 操作系统和应用的关系
    操作系统和应用程序之间存在着密切的关系,它们相互作用、相互依赖,共同实现计算机系统的功能。操作系统是计算机系统的核心软件,负责管理和控制计算机的硬件资源,提供一个稳定、安全的运行环境。它的主要功能包括进程管理、内存管理、文件系统、网络通信和设备驱动等。操作系统通过这......
  • 如何通过汇编语言了解实际的操作过程
    汇编语言是一种低级编程语言,它直接对应于计算机的指令集,是机器语言和高级语言之间的桥梁。通过汇编语言,我们可以更深入地了解计算机的实际操作过程。首先,要理解汇编语言,你需要对计算机的体系结构有一定的了解,包括CPU的指令集、内存的组织方式、I/O设备等。这样,你才能理解汇编指令......
  • comfyUI相关
     pipinstall--upgradepippipinstall huggingface-cli gitconfig--globalcredential.helperstorehuggingface-clilogin  huggingface-clidownloadadept/fuyu-8bmodel-00001-of-00002.safetensors--local-dir.huggingface-clidownloadadept/fuyu-8b--......
  • 操作系统和应用的关系
    通过阅读《程序是怎样跑起来的》第九章,让我知道了操作系统和应用之间的关系是操作系统为应用软件提供运行环境和基础服务,而应用软件则是直接为用户提供服务的软件。操作系统是计算机系统的核心,它管理着硬件资源(如CPU,内存,硬盘和外设等),并提供了系统服务,如内存管理、文件管理和设备管......
  • 乒乓操作
    乒乓操作常用与对数据流的处理,他可以节约缓存空间,对数据流无缝处理。理论学习外部输入数据流通过输入数据流选择单元将数据流输入到数据缓存模块,比较常用的存储单元有双口RAM,FIFO,SDRAM等。在第一个缓冲周期,数据流通过“输入数据流选择单元”将数据写入“数据缓冲模块1......
  • 神中神之【Map】遍历操作
    前言首先插入几个值方便操作'''Map<Integer,String>map=newHashMap<>();map.put(1,"A");map.put(2,"B");map.put(3,"C");//System.out.println(map);->{1=A,2=B,3=C}调用tostring'''//......
  • 分析一个steam假入库行为,附带相关恶意样本
    0x00、前言朋友发来一个图片,说自己买了某宝上steam激活sdk,结果客服发过来一个教程让他下载游戏,想问问我有没有问题。0x01、看了图片后立刻来了兴趣。命令很简单,先是IRM远程访问,然后IEX执行。手动访问了一下cdk.yesilovemyhome.com,发现跳转steam官方商城了https://store.steam......
  • xlua - lua中操作c#对象
    1,c#对象映射为lua的userdataa)默认情况,c#对象都是映射为lua的userdata,数据存放在c#层,调用函数也是走c#层。functionLuaUseVector3(v1,v2)v1.x=10print(type(v1),v1.x,v1.y,v1.z)print("v1:",v1,"v2:",v2)print("v1+v2:",v1+v2)v1......
  • 【专题】2024物联网平台产业研究报告及案例集报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=35235原文出处:拓端数据部落公众号前三季度,我国软件业务收入达87610亿元,同比增长13.5%。统计范围涵盖软件及信息技术服务、集成电路设计、基础软件、工业软件、信息安全、工业互联网平台和数据服务等。软件业务收入由软件产品、信息技术服务、信息......