office文件加水印(可重复)

Word图片批量加水印的3种方案与性能优化 图片水印技术是数字版权保护的基础手段,通过可见/不可见标识实现内容溯源和防篡改。其核心原理是在像素层叠加特定图案或信息,同时保持原始图像可用性。在办公自动化场景中,批量处理Word文档图片水印能显著提升效率,尤其适用于技术文档、产品手册等包含大量插图的场景。通过VBA宏、Python脚本或专业插件等不同技术方案,开发者可以实现水印位置校准、透明度调节等定制需求。其中Python-docx结合多线程的方案在实测中处理237张图片仅需8.2秒,而商业插件Office Tab在格式兼容性方面表现更优。对于企业级应 阅读详情

doc/docx水印实现

import com.spire.doc.*;
import com.spire.doc.documents.WatermarkLayout;

import java.awt.*;
import java.io.File;

public class DocWatermarkServiceImpl implements OfficeWatermarkService {
    @Override
    public void saveWatermark(File file, String watermarkText,String imgPath,Boolean flag) {
        //加载测试文档
        Document document = new Document();

        document.loadFromFile(file.getPath());
        document.setWatermark(null);
        //这里指定目录下的word文档
        //插入文本水印
        InsertTextWatermark(document.getSections().get(0), watermarkText,imgPath,flag);
        file.delete();
        //保存文档
        if(file.getPath().endsWith(".docx")) {
            document.saveToFile(file.getPath(), FileFormat.Docx);
        }else {
            document.saveToFile(file.getPath(), FileFormat.Doc);
        }
    }

    //自定义方法指定文本水印字样,并设置成水印
    private static void InsertTextWatermark(Section section, String watermarkText,String imgPath,Boolean flag) {
        PictureWatermark pictureWatermark = new PictureWatermark();
        pictureWatermark.setPicture(imgPath);

        TextWatermark txtWatermark = new TextWatermark();
        txtWatermark.setText(watermarkText);
        txtWatermark.setFontSize(40);
        txtWatermark.setColor(Color.red);
        txtWatermark.setLayout(WatermarkLayout.Diagonal);
        if(flag){
            section.getDocument().setWatermark(pictureWatermark);
        }else {
            section.getDocument().setWatermark(txtWatermark);
        }

    }
}

xls和xlsx

  /**
     * xlsx 类型添加水印
     *
     * @param inputFilePath
     * @param text
     * @return
     */
    public static void excelWaterMarkForXlsx(String inputFilePath, String text, String imgPath, Boolean flag) {
        FileInputStream is = null;
        FileOutputStream out = null;
        XSSFWorkbook workbook = null;
        ByteArrayOutputStream os = null;
        BufferedImage image = new BufferedImage(200, 400, BufferedImage.TYPE_INT_RGB);
        ;
        try {
            //生成水印图片并导出字节流
            if (flag) {
                File img = new File(imgPath);
                BufferedImage bufferedResizedImage = ImageIO.read(img);

                Image resizedImage = bufferedResizedImage.getScaledInstance(200, 400, Image.SCALE_SMOOTH);
                image = new BufferedImage(200, 400, BufferedImage.TYPE_INT_RGB);
                image.getGraphics().drawImage(resizedImage, 0, 0, null);

            } else {
                image = FontImageUtil.createWatermarkImage(new FontImageUtil.Watermark(true, text, null, null));
            }
            os = new ByteArrayOutputStream();
            ImageIO.write(image, "png", os);
            //获取excel工作簿
            is = new FileInputStream(inputFilePath);
            workbook = new XSSFWorkbook(is);
            int pictureIdx = workbook.addPicture(os.toByteArray(), Workbook.PICTURE_TYPE_PNG);
            POIXMLDocumentPart poixmlDocumentPart = workbook.getAllPictures().get(pictureIdx);
            //获取每个Sheet表并插入水印
            for (int i = 0; i < workbook.getNumberOfSheets(); i++) {
                XSSFSheet sheet1 = workbook.getSheetAt(i);

                PackagePartName ppn = poixmlDocumentPart.getPackagePart().getPartName();
                String relType = XSSFRelation.IMAGES.getRelation();
                //add relation from sheet to the picture data
                PackageRelationship pr = sheet1.getPackagePart().addRelationship(ppn, TargetMode.INTERNAL, relType, null);
                //set background picture to sheet
                if (sheet1.getCTWorksheet() != null) {
                    sheet1.getCTWorksheet().unsetPicture();
                }
                sheet1.getCTWorksheet().addNewPicture().setId(pr.getId());

            }
            //生成添加水印的excel文件
            File f = new File(inputFilePath);
            f.delete();
            out = new FileOutputStream(inputFilePath);
            workbook.write(out);
        } catch (Exception e) {
            logger.error("excel文件添加水印异常", e);
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (Exception e) {
                    logger.error("excel输入文件关闭异常", e);
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (Exception e) {
                    logger.error("excel输出文件关闭异常", e);
                }
            }
            if (workbook != null) {
                try {
                    workbook.close();
                } catch (Exception e) {
                    logger.error("excel工作簿关闭异常", e);
                }
            }
            if (os != null) {
                try {
                    os.close();
                } catch (Exception e) {
                    logger.error("水印图片字节流关闭异常", e);
                }
            }
        }
    }

    /**
     * xls 类型添加水印
     *
     * @param inputFilePath
     * @param text
     * @return
     */
    public static void excelWaterMarkForXls(String inputFilePath, String text, String imgPath, Boolean flag) {
        FileInputStream is = null;
        FileOutputStream out = null;
        HSSFWorkbook workbook = null;
        ByteArrayOutputStream os = null;
        BufferedImage image = null;
        //水印图片
        String tarImgPath = "";
        try {
            //生成水印图片并导出字节流
            if (flag) {
                File img = new File(imgPath);
                BufferedImage bufferedResizedImage = ImageIO.read(img);

                Image resizedImage = bufferedResizedImage.getScaledInstance(200, 400, Image.SCALE_SMOOTH);
                image = new BufferedImage(200, 400, BufferedImage.TYPE_INT_RGB);
                image.getGraphics().drawImage(resizedImage, 0, 0, null);
                tarImgPath = imgPath;
            } else {
                image = FontImageUtil.createWatermarkImage(new FontImageUtil.Watermark(true, text, null, null));
                File f1 = new File(inputFilePath);
                tarImgPath = f1.getParent() + File.separator + System.nanoTime() + text + ".png";
            }
            FileOutputStream outImgStream = new FileOutputStream(tarImgPath);
            ImageIO.write(image, "png", outImgStream);
            //获取excel工作簿
            is = new FileInputStream(inputFilePath);
            workbook = new HSSFWorkbook(is);
            byte[] data = getBackgroundBitmapData(tarImgPath); //PNG must not have transparency
            for (int k = 0; k < workbook.getNumberOfSheets(); k++) {
                HSSFSheet sheet1 = workbook.getSheetAt(k);
                Field _sheet = HSSFSheet.class.getDeclaredField("_sheet");
                _sheet.setAccessible(true);
                InternalSheet internalsheet = (InternalSheet) _sheet.get(sheet1);
                // get List of RecordBase
                Field _records = InternalSheet.class.getDeclaredField("_records");
                _records.setAccessible(true);
                @SuppressWarnings("unchecked")
                List<RecordBase> records = (List<RecordBase>) _records.get(internalsheet);
                // do creating BitmapRecord and ContinueRecords from the data in parts of 8220 bytes
                BitmapRecord bitmapRecord;
                List<ContinueRecord> continueRecords = new ArrayList<>();
                int bytes;
                if (data.length > 8220) {
                    bitmapRecord = new BitmapRecord(Arrays.copyOfRange(data, 0, 8220));
                    bytes = 8220;
                    while (bytes < data.length) {
                        if ((bytes + 8220) < data.length) {
                            continueRecords.add(new ContinueRecord(Arrays.copyOfRange(data, bytes, bytes + 8220)));
                            bytes += 8220;
                        } else {
                            continueRecords.add(new ContinueRecord(Arrays.copyOfRange(data, bytes, data.length)));
                            break;
                        }
                    }
                } else {
                    bitmapRecord = new BitmapRecord(data);
                }
                int i = 0;
                for (RecordBase r : records) {
                    if (r instanceof org.apache.poi.hssf.record.aggregates.PageSettingsBlock) {
                        break;
                    }
                    i++;
                }
                records.add(++i, bitmapRecord);
                for (ContinueRecord continueRecord : continueRecords) {
                    records.add(++i, continueRecord);
                }

            }
            //生成添加水印的excel文件
            File f = new File(inputFilePath);
            f.delete();
            String outputFilePath = f.getParent() + File.separator + System.currentTimeMillis() + f.getName();
            out = new FileOutputStream(inputFilePath);
            logger.info(outputFilePath);
            outImgStream.close();
            //boolean res = new File(tarImgPath).delete();
            workbook.write(out);
        } catch (Exception e) {
            logger.error("excel文件添加水印异常", e);
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (Exception e) {
                    logger.error("excel输入文件关闭异常", e);
                }
            }
            if (out != null) {
                try {
                    out.close();
                } catch (Exception e) {
                    logger.error("excel输出文件关闭异常", e);
                }
            }
            if (workbook != null) {
                try {
                    workbook.close();
                } catch (Exception e) {
                    logger.error("excel工作簿关闭异常", e);
                }
            }
            if (os != null) {
                try {
                    os.close();
                } catch (Exception e) {
                    logger.error("水印图片字节流关闭异常", e);
                }
            }

            new File(tarImgPath).delete();

        }
    }


    static byte[] getBackgroundBitmapData(String filePath) throws Exception {

        //see https://www.openoffice.org/sc/excelfileformat.pdf - BITMAP

        // get file byte data in type BufferedImage.TYPE_3BYTE_BGR
        FileInputStream fio = new FileInputStream(filePath);
        BufferedImage in = ImageIO.read(fio);
        BufferedImage image = new BufferedImage(in.getWidth(), in.getHeight(), BufferedImage.TYPE_3BYTE_BGR);
        Graphics2D graphics = image.createGraphics();
        graphics.drawImage(in, null, 0, 0);
        graphics.dispose();

        // calculate row size (c)
        int rowSize = ((24 * image.getWidth() + 31) / 32) * 4;

        ByteArrayOutputStream output = new ByteArrayOutputStream(image.getHeight() * rowSize * 3 + 1024);

        // put the record headers into the data
        ByteBuffer header = ByteBuffer.allocate(8 + 12);
        header.order(ByteOrder.LITTLE_ENDIAN);

        // Undocumented XLS stuff
        header.putShort((short) 0x09);
        header.putShort((short) 0x01);
        header.putInt(image.getHeight() * rowSize + 12); // Size of image stream

        // BITMAPCOREHEADER (a)
        header.putInt(12);

        header.putShort((short) image.getWidth());
        header.putShort((short) image.getHeight()); // Use -height if writing top-down

        header.putShort((short) 1); // planes, always 1
        header.putShort((short) 24); // bitcount

        output.write(header.array());

        // Output rows bottom-up (b)
        Raster raster = image.getRaster()
                .createChild(0, 0, image.getWidth(), image.getHeight(), 0, 0, new int[]{2, 1, 0}); // Reverse BGR -> RGB (d)
        byte[] row = new byte[rowSize]; // padded (c)

        for (int i = image.getHeight() - 1; i >= 0; i--) {
            row = (byte[]) raster.getDataElements(0, i, image.getWidth(), 1, row);
            output.write(row);
        }
        fio.close();

        return output.toByteArray();
    }

pdf水印

   /**
     * PDF添加文字水印
     *
     * @param srcPdf   上传文件
     * @param logoText 水印文字
     */
    public static MultipartFile setWaterMarkToPdfByWords(MultipartFile srcPdf, String logoText) {
        try {
            InputStream inputStream = srcPdf.getInputStream();
            PdfDocument pdf = new PdfDocument();
            //加载示例文档
            pdf.loadFromStream(inputStream);
            //true防止中文乱码
            PdfTrueTypeFont pdfTrueTypeFont = new PdfTrueTypeFont(new Font("黑体", Font.BOLD, 55), true);
            BufferedImage image;
            for (int i = 0; i < pdf.getPages().getCount(); i++) {

                //当前页
                PdfPageBase page = pdf.getPages().get(i);

                double width = page.getCanvas().getClientSize().getWidth();
                double height = page.getCanvas().getClientSize().getHeight();
                //1、当前页进行区域划分,当前页纵向3列,横向3行,共9个区域
                Dimension2D dimension2D = new Dimension();
                dimension2D.setSize(width, height);
                //2、对区域画水印
                PdfTilingBrush brush = new PdfTilingBrush(dimension2D);
                //透明度
                brush.getGraphics().setTransparency(ALPHA);
                //旋转角度
                brush.getGraphics().rotateTransform(DEGREE);
                //设置区域水印位置,垂直水平居中
                double offsetX = 0;
                double offsetY = brush.getSize().getHeight() / 2;
                brush.getGraphics().translateTransform(offsetX, offsetY);
                //画水印,居中展示:文本、字体、颜色、x、y、居中展示
                brush.getGraphics().drawString(logoText, pdfTrueTypeFont, PdfBrushes.getCadetBlue(), 0, 0, new PdfStringFormat(PdfTextAlignment.Center));
                //恢复
                brush.getGraphics().restore();
                //保存格式
                brush.getGraphics().save();
                //3、根据当前页大小,创建新画布
                Rectangle2D loRect = new Rectangle2D.Float();
                loRect.setFrame(new Point2D.Float(0, 0), page.getCanvas().getClientSize());
                //4、将新画布和水印画入当前页
                page.getCanvas().drawRectangle(brush, loRect);
            }
            //设置缓存区
            pdf.saveToFile(OUT_PATH + srcPdf.getOriginalFilename());
            pdf.close();
            //读取缓存区的文件
            srcPdf = fileToMultipart(OUT_PATH + srcPdf.getOriginalFilename());
        } catch (Exception e) {
            logger.info("pdf添加水印异常: " + e);
            e.printStackTrace();
        }
        return srcPdf;
    }

    /**
     * pdf图片水印
     *
     * @param path
     * @param imgPath
     */
    public static void pdfSavePic(File path,String imgPath){
        PdfDocument pdf = new PdfDocument();
        //载入PDF文档
        pdf.loadFromFile(path.getPath());
        //载入图片
        PdfImage image = PdfImage.fromFile(imgPath);
        //获取图片的宽度和高度用于计算插入水印的初始坐标
        int imageWidth = image.getWidth();
        int imageHeight = image.getHeight();
        //循环遍历所有页面以插入水印
        for (int i = 0; i < pdf.getPages().getCount(); i++) {
            //获取一个页面
            PdfPageBase page = pdf.getPages().get(i);
            //获取该页面的宽度和高度,用于计算插入水印的初始坐标
            float pageWidth = (float) (page.getActualSize().getWidth());
            float pageHeight = (float) (page.getActualSize().getHeight());
            //设置水印图片的透明度
            page.getCanvas().setTransparency(0.3f);
            //在页面的中间位置绘制水印图片
            page.getCanvas().drawImage(image, pageWidth/2 - imageWidth/2, pageHeight/2 - imageHeight/2, imageWidth, imageHeight);
        }
        path.delete();
        //保存文档
        pdf.saveToFile(path.getPath());
    }

ppt/pptx实现水印

 public static void excelWaterMarkForPPTx(File file, String text, String imgPath, Boolean flag) {
        String inputFilePath = file.getPath();
        FileInputStream is = null;
        FileOutputStream out = null;
        XMLSlideShow ppt = null;
        ByteArrayOutputStream os = null;
        BufferedImage image = null;
        try {
            // 生成水印图片并导出字节流
            if (flag) {
                File img = new File(imgPath);
                image = ImageIO.read(img);
            } else {
                image = FontImageUtil.createWatermarkImage(new FontImageUtil.Watermark(true, text, null, null));
            }

            os = new ByteArrayOutputStream();
            ImageIO.write(image, "png", os);

            // 获取 PowerPoint 文件
            is = new FileInputStream(inputFilePath);
            ppt = new XMLSlideShow(is);
            List<XSLFPictureData> pictureData = ppt.getPictureData();
            List<XSLFPictureData> pictureDataList = new ArrayList<XSLFPictureData>() {{
                addAll(pictureData);
            }};
            int size = pictureData.size();

            XSLFPictureData picData = ppt.addPicture(os.toByteArray(), PictureData.PictureType.PNG);
            // 遍历每一页并插入水印
            for (XSLFSlide slide : ppt.getSlides()) {
                if (size != 0) {
                    if (pictureDataList.contains(picData)) {
                        return;
                    } else {
                        XSLFPictureShape pic = slide.createPicture(picData);
                        // 设置图片位置和大小
                        pic.setAnchor(new Rectangle2D.Double(0, 0, picData.getImageDimension().getWidth(), picData.getImageDimension().getHeight()));
                        //pictureData.removeAll(pictureDataList);

                    }
                } else {
                    XSLFPictureShape pic = slide.createPicture(picData);
                    // 设置图片位置和大小
                    pic.setAnchor(new Rectangle2D.Double(0, 0, picData.getImageDimension().getWidth(), picData.getImageDimension().getHeight()));
                }
            }

            // 生成带水印的 PowerPoint 文件
            String tempFilePath = inputFilePath + "temp";
            out = new FileOutputStream(tempFilePath);
            ppt.write(out);

            // 关闭并删除原始文件
            ppt.close();
            is.close();
            out.close();
            File originalFile = new File(inputFilePath);
            originalFile.delete();

            // 重命名临时文件为原始文件
            File tempFile = new File(tempFilePath);
            tempFile.renameTo(originalFile);
        } catch (Exception e) {
            logger.error("PowerPoint 文件添加水印异常", e);
        } finally {
            // 关闭资源
            try {
                if (is != null) is.close();
            } catch (IOException e) {
                logger.error("PowerPoint 输入文件关闭异常", e);
            }
            try {
                if (out != null) out.close();
            } catch (IOException e) {
                logger.error("PowerPoint 输出文件关闭异常", e);
            }
            try {
                if (ppt != null) ppt.close();
            } catch (IOException e) {
                logger.error("PowerPoint 关闭异常", e);
            }
            try {
                if (os != null) os.close();
            } catch (IOException e) {
                logger.error("水印图片字节流关闭异常", e);
            }
        }
    }

    public static void excelWaterMarkForPPT(File file, String text, String imgPath, Boolean flag) {
        String inputFilePath = file.getPath();
        FileInputStream is = null;
        FileOutputStream out = null;
        HSLFSlideShow ppt = null;
        ByteArrayOutputStream os = null;
        BufferedImage image = null;
        try {
            if (flag) {
                File img = new File(imgPath);
                image = ImageIO.read(img);
            } else {
                image = FontImageUtil.createWatermarkImage(new FontImageUtil.Watermark(true, text, null, null));
            }
            // 生成水印图片并导出字节流
            os = new ByteArrayOutputStream();
            ImageIO.write(image, "png", os);

            // 获取 PowerPoint 文件
            is = new FileInputStream(inputFilePath);
            ppt = new HSLFSlideShow(is);
            HSLFPictureData picData = ppt.addPicture(os.toByteArray(), PictureData.PictureType.PNG);

            // 遍历每一页并插入水印
            for (HSLFSlide slide : ppt.getSlides()) {
                // 创建图片并设置位置
                HSLFPictureShape pic = new HSLFPictureShape(picData);
                pic.setAnchor(new Rectangle2D.Double(0, 0, picData.getImageDimension().getWidth(), picData.getImageDimension().getHeight()));
                slide.addShape(pic);
            }

            // 生成带水印的 PowerPoint 文件
            String tempFilePath = inputFilePath + "temp";
            out = new FileOutputStream(tempFilePath);
            ppt.write(out);

            // 关闭并删除原始文件
            ppt.close();
            is.close();
            out.close();
            File originalFile = new File(inputFilePath);
            originalFile.delete();

            // 重命名临时文件为原始文件
            File tempFile = new File(tempFilePath);
            tempFile.renameTo(originalFile);
        } catch (Exception e) {
            logger.error("PowerPoint 文件添加水印异常", e);
        } finally {
            // 关闭资源
            try {
                if (is != null) is.close();
            } catch (IOException e) {
                logger.error("PowerPoint 输入文件关闭异常", e);
            }
            try {
                if (out != null) out.close();
            } catch (IOException e) {
                logger.error("PowerPoint 输出文件关闭异常", e);
            }
            try {
                if (ppt != null) ppt.close();
            } catch (IOException e) {
                logger.error("PowerPoint 关闭异常", e);
            }
            try {
                if (os != null) os.close();
            } catch (IOException e) {
                logger.error("水印图片字节流关闭异常", e);
            }
        }

    }

Office CLI技能库:文档自动化处理与批量转换实战指南 命令行工具是提升办公效率的关键技术,它允许开发者通过脚本批量处理文档,实现自动化操作。其核心原理在于将图形界面操作转化为可编程命令,通过参数化控制执行流程。这项技术的价值在于能够显著减少重复性人工操作,提升处理准确性和一致性,尤其适用于大规模文档处理场景。在实际应用中,文档批量转换与处理、报告自动化生成、模板化内容生成等成为高频需求。例如,运维工程师常需批量将Word文档转换为PDF格式,数据分析师则依赖自动化脚本整合Excel报表。针对这些场景,社区驱动的技能库应运而生,它汇集了经过验证的命令组合和最佳实 阅读详情

相关推荐

Adobe Acrobat Pro 2024隐藏功能大揭秘:这些高效技巧让你的PDF处理快人一步

本文深入揭秘Adobe Acrobat Pro 2024的隐藏高效功能,助您大幅提升PDF处理效率。涵盖智能内容重排、动作向导自动化、高级OCR优化、精细协作审阅及安全集成等核心技巧,帮助用户从基础操作转向构建自动化文档处理工作流,实现PDF处理的智能化与高效化。

yhn45678901的博客 1009

前端使用onlyOffice添加水印

【代码】前端使用onlyOffice添加水印。

Anony_me的博客 2082

DocWatermark(doc文档去水印工具)

可以批量去除文档中的水印 运行cracked-DocWatermark.exe即可

java操作word文档(文字,图片,表格添加以及替换操作)

注:本文由于个人工作需要,有对多个他人博文进行借鉴,但是多数博文都只是讲到了小部分,例如图片/表格的操作,都只有根据书签进行替换,比较片面,本人有总结到根据文字进行图片/表格的替换,希望可以帮到更多有需要的朋友 。 java代码对word文档进行文字,图片,表格的添加以及替换,效果图如下: 原文档: 替换后文档: 正文开始 前提:需要引入包 Spire.Doc.jar 大家可...

Cjx_Flying的博客 7423

Word文档水印批量设置工具 1.61DocWatermark161

Word文档水印批量设置工具 1.61DocWatermark161

使用VBS设置Word图片水印(docWatermark.vbs)

使用VBS脚本语言,为WORD添加图片水印。 你也可以参照说明,添加文字水印。 其实,Word的水印,就是设置的页眉。 用法: docWaterMark.vbs "C:\Test.doc" "C:\Water.jpg" 你可在批处理中来调用该脚本,就可以实现批量设置水印了。 编写该脚本的初衷是:为了由程序控制添加Word图片水印的功能。

Java中给文件添加水印的通用方法

摘要:本文介绍了一个通用的文件水印添加方法,支持图片、PDF、Word和Excel等多种文件格式。通过Java实现,该方法能够处理不同格式文件的差异性,包括Word的.doc/.docx和Excel的.xls/.xlsx版本。核心方法addWatermark接收文件流、水印图片、坐标和透明度参数,根据文件类型调用不同的处理逻辑:图片使用ImageIO处理,PDF通过PDFBox添加透明水印,Excel和Word则分别处理新旧格式。方法还考虑了内存优化和临时文件处理,最终返回带水印的文件流。

qq_52295073的博客 536

开源libmodbus编译为32位和64位动态库

libmodbus 是支持Linux,Mac OS X,window 的一个开源库,支持modbus TCP和RTU 两种模式。

lemontree1945的博客 1923

word加多行水印_职场干货|分享40个Word实用技巧

01、快速切换字母大小写鼠标选中需要切换大小写的英文字母,按住键盘“Shift+F3” 键可重复切换,若大家用的是笔记本电脑,则还要同时按下Fn键。02、快速自定义水印在Word菜单区域中点击“设计” 选项,在功能区右侧点击“水印” ,下拉选项中预置了很多水印格式,大家可根据需要自定义水印并设置。03、快速设置跨页表格标题行鼠标点击文档表格第一个标题行任意单元格,再在菜单区域中点击“布局” ,在功...

weixin_39767322的博客 1458

外设高级定时器互补输出带死区控制实验

外设高级定时器互补输出带死区控制实验

ff_juju的博客 1652

爬虫风控实战:当你的代理IP被数美滑块盯上时,如何优雅破解?

本文深入探讨了爬虫风控对抗中数美滑块验证码的破解与防御策略。通过分析数美滑块的多层防御机制,提出了代理IP池精细化管理、请求特征拟人化改造以及工程化滑块验证解决方案等系统性方法,帮助开发者有效降低验证码触发率,提升爬虫效率。

weixin_27419879的博客 207

Claude Agent Skills 完全指南:把可重复的办公与开发流程装进 AI 的技能包里

skills3 是 Anthropic 官方开源的 Agent Skills 仓库:它把一组组"指令 + 脚本 + 资源"打包成可复用的技能(Skill),让 Claude 在处理 Word、PDF、测试前端、生成 MCP 服务等特定任务时,能按你定义好的方式稳定重复地执行,而不是每次从零发挥。对日常要产出文档、验证页面、沉淀团队规范的开发者来说,这个仓库既是现成工具箱,也是学习"怎么给 AI 写

gitblog_00879的博客 967

海康视觉相机驱动软件MVS参数配置全攻略(附接线图+避坑指南)

本文提供了海康视觉相机驱动软件MVS从硬件连接到软件参数配置的完整指南。详细解析了供电与通讯线缆的区分、PNP/NPN信号逻辑的接线避坑方法,并重点阐述了MVS软件中触发模式、网络IP配置、图像采集及光源控制等核心参数的设置技巧,旨在帮助用户快速完成相机调试,实现稳定高效的图像采集。

weixin_29204205的博客 399

重装系统后激活总是翻车?一个开源脚本三步搞定Windows与Office长期激活

KMS_VL_ALL_AIO 是一款开源的智能激活脚本,只需双击一个 `.cmd` 文件,就能同时处理 Windows 全系和 Office 2010 到 2024 的批量激活、自动续期与状态检测。对普通用户来说,它最大的价值在于"一次配置、长期省心"——不用反复找密钥,不用每次装完系统重新折腾。 ## 先别急着双击,弄清它到底解决什么问题 刚重装完系统的人通常有三个痛点: 1. 系统提示"

gitblog_00427的博客 198

医学影像处理实战:如何用Python+SimpleITK搞定DICOM/NIfTI重采样(附完整代码)

本文详细介绍了如何使用Python和SimpleITK库实现医学影像(DICOM/NIfTI格式)的智能重采样技术。通过实战代码演示,帮助读者掌握医学图像处理中的关键步骤,包括环境搭建、数据准备、核心算法实现和质量验证,解决医学AI领域中的影像标准化难题。

linux的博客 981

C# CAD2016 多边形顶点按方向重新排序

这样,通过以上步骤,我们找到了一个多边形的一个候选起始顶点(可能位于西北方向),并且已经获取了该多边形的边界框信息,这些信息对于后续判断顶点排列顺序及处理其他相关问题具有重要意义。完整地处理八个方向(东北、东南、西南、西北、北、南、东、西),我们可以创建一个方法来获取多边形相对于给定点的最近顶点及其对应的方向。对象(或类似的多边形表示方式),其中包含了多边形的顶点。//附送AI 图片无版权 随意用 龙年大吉大利。

转眼之间 一路有你 1356

办公文件格式转换实战:从基础原理到自动化批量处理

文件格式转换是数据处理与文档协作中的基础技术环节,其核心原理在于不同软件对文档结构、样式和数据的编码与解析方式存在差异。理解格式转换的技术本质,有助于在办公自动化、数据迁移和系统集成等场景中,确保信息的完整性与可用性。从技术价值看,高效的转换方案能显著提升工作流效率,减少人工干预,并保障数据安全。在应用层面,无论是单文件的高保真转换,还是基于脚本的批量处理,都需要根据具体需求选择合适工具。本文聚焦于Word、Excel、PPT三大办公文档的转换,深入探讨了从检查备份、使用原生软件“另存为”功能,到利用VBA

weixin_30859423的博客 429

第一篇:APS智能排产理论核心与求解器选型指南

本文系统解析了APS(高级计划与排程)系统的核心功能与技术实现。APS作为融合生产计划与排程的智能决策系统,通过运筹优化算法实现全局最优,平衡交付与效率。重点探讨了混合整数线性规划(MILP)在APS中的应用,包括设备分配、生产批量和人员班次优化等场景,并分析了其局限性与其他算法(如启发式算法)的互补性。文章还提供了APS实施策略建议和优化建模技巧,强调从简单模型开始迭代验证的重要性。最后介绍了甘特图在APS中的多维可视化作用,包括计划调整和决策支持功能。全文为理解APS系统原理及实践应用提供了全面指导。

算法工程师 544

一次搞定Windows与Office激活:KMS智能激活脚本KMS_VL_ALL_AIO完整实战指南

当你的电脑右下角开始出现"Windows尚未激活"的水印,或者打开Word时被"激活失败"的红色横幅反复打扰,说明系统或Office的授权状态已经亮起红灯。面对这类问题,常见的处理方式要么是寻找在线激活工具(稳定性堪忧),要么联系企业IT部门(个人用户无门可入)。KMS_VL_ALL_AIO就是这样一款面向个人与中小企业场景的智能激活脚本,它把企业级KMS(Key Management Servi

gitblog_00222的博客 145

YOLO11-Seg优化:卷积变体系列篇 | 动态蛇形卷积(Dynamic Snake Convolution) | ICCV2023

动态蛇形卷积(Dynamic Snake Convolution),增强微小特征提取能力,引入到YOLO11-Seg,与C3k2结合实现二次创新

会AI的学姐 371

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

微软激活脚本 MAS 快速上手:4 种激活方式对比与完整流程

MAS(Microsoft Activation Scripts,微软激活脚本)是一个开源免费的 Windows 与 Office 激活工具,把 HWID、Ohook、TSforge、在线 KMS 四种激活方式整合进同一个脚本里,内置状态检查、版本切换和故障排除功能。本文带你完成从下载安装到验证结果的完整流程,先对比 4 种激活方式的适用场景,再给出激活失败的排查清单和无人值守部署技巧。 ##

gitblog_01150的博客 843

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

KMS激活脚本终极指南:KMS_VL_ALL_AIO让Windows和Office激活一次完成、自动续期

> 一台新电脑、一份系统安装镜像、一套 Office 办公套件——当"激活"两个字摆在面前,很多人会立刻想起找序列号、搜注册机、刷教程的日子。而今天要分享的 KMS_VL_ALL_AIO,是一个用单个脚本文件承载整套 KMS 激活方案的开源项目:**KMS激活脚本** 只需要跑一次,就能同时处理 Windows 和 Office 的激活,还能装上"自动续期"开关,让 180 天的 KMS 激活周期

gitblog_00759的博客 182

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

KMS_VL_ALL_AIO智能激活脚本完整教程:3分钟免费搞定Windows与Office激活

拿到脚本、右键管理员运行、敲一个回车——我的测试机上Windows 10右下角的水印消失了,Word也恢复了完整功能。整个过程不到三分钟,全程没输入任何序列号,也没有跳转任何付费页面。这篇文章就围绕 **KMS_VL_ALL_AIO智能激活脚本** 这个开源工具展开,把它的工作原理、上手步骤和避坑要点一次讲透,保证你读完自己就能操作。 ## 为什么一个脚本能"免费激活"?先搞懂KMS的底层逻辑

gitblog_00923的博客 72

专业文件格式转换工具:批量处理、自动化工作流与700+格式支持

文件格式转换是数字内容处理中的基础技术,其核心原理是通过编解码器在不同文件结构间进行数据解析与重组。这项技术的价值在于打破信息孤岛,实现跨平台、跨应用的数据流通,从而提升工作流效率。在实际应用中,它广泛服务于设计素材处理、工程图纸管理、文档数字化等场景,尤其对于需要处理大量PSD、CAD、PDF等专业格式的团队至关重要。通过集成批量处理引擎与自动化工作流,现代转换工具能够将重复性操作固化为预设动作,例如批量RAW转JPEG时同步添加水印,或将DWG图纸批量转为打印就绪的PDF。这种将编辑、转换、输出一体化的

weixin_30357231的博客 571

还在为激活弹窗头疼?这款免费KMS激活工具,两条命令搞定Windows和Office

新装的系统用了没几天,屏幕上就开始出现"激活 Windows"的提示,文档编辑软件里一堆功能按钮也变成灰色,动都动不了——经历过的人都知道有多烦。如果你正在找一款靠谱的 KMS激活工具,那么开源的 **KMS_VL_ALL_AIO** 值得花三分钟了解一下:单文件、无捆绑、一条命令下载,Windows 与 Office 的激活问题都能一次解决。 ## 先看一个真实场景:被"未激活"支配的周末

gitblog_00401的博客 45

KMS_VL_ALL_AIO使用教程:一个脚本搞定Windows和Office激活,支持180天自动续期

如果你的电脑上同时装着 Windows 系统和 Microsoft Office,"激活"这件事大概率折腾过你不少时间:要么重装系统后右下角顶着"未激活"的水印,要么 Office 隔三差五弹出续期提示。今天要介绍的 **KMS_VL_ALL_AIO** 是一个开源的智能激活脚本,它通过本地 KMS 服务帮你一键完成 Windows 和 Office 激活,并内置 180 天自动续期机制。这份使用

gitblog_00372的博客 123
上一篇: 实现主线程在子线程执行完后执行
下一篇: 屏幕水印添加
yhx_java
博客等级 码龄5年 3粉丝 5原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值