ITEXT-定位PDF中图片的坐标与页码

PDF带目录导出java_itextpdf为pdf文件添加目录(可跳转) 需求: 有一个pdf文件source.pdf , 有这个pdf的目录数据Map catalogs , 将catalog作为目录添加到source.pdf文件中 ,且可以点击目录跳转到指定页描述:原本的source.pdf是没有目录的 , 且catalog目录数据是用别的方法读出来的或者自定义的工具代码如下://需要导入的包import com.itextpdf.kernel.pdf.PdfDocu... 阅读详情

问题场景:

用itext自动生成PDF的过程中,想要在PDF中的某一页加入水印,这个水印图片的页码不固定,所以不能直接用‘sealStamperUnder = stamp.getUnderContent(page-1);’方式加入水印。但是该水印在某一固定图片的上一页,那么我们可以定位这张图片的位置信息,以此获取水印图片的页码信息。通过这种方法还可以获得图片的坐标信息。

代码

需导入的jar包:itext-pdfa-5.5.6.jar、itext-xtra-5.5.6.jar、itext-5.5.6.jar、itext-asian.jar

/**
     * 返回关键字所在页码和坐标
     * @param filePath  PDF位置
     * @param image     要定位的图片
     * @return  List<float[]>  返回关键字所在的坐标和页数 float[0] >> X; float[1] >> Y; float[2] >> page
     */
    public List<float[]> getKeyWords(String filePath, final Image image) {
        final List<float[]> arrays = new ArrayList<float[]>();
        PdfReader pdfReader;
            try {
                pdfReader = new PdfReader(filePath);
                int pageNum = pdfReader.getNumberOfPages();
                PdfReaderContentParser pdfReaderContentParser = new PdfReaderContentParser(pdfReader);

                for (int i = 1; i <= pageNum; i++) {

                    final int finalI = i;
                    pdfReaderContentParser.processContent(i, new RenderListener() {
                        //此方法是监听PDF里的文字内容,有重复情况会都把坐标和页码信息都存入arrays里
                        @Override
                        public void renderText(TextRenderInfo textRenderInfo) {
                            /*String text = textRenderInfo.getText(); // 整页内容

                            if (null != text && text.contains(key)) {
                                Rectangle2D.Float boundingRectange = textRenderInfo
                                        .getBaseline().getBoundingRectange();
                                float[] resu = new float[3];
                                resu[0] = (float)boundingRectange.getCenterX();
                                resu[1] = (float)boundingRectange.getCenterY();
                                resu[2] = finalI;
                                arrays.add(resu);
                            }*/
                        }

                        //此方法是监听PDF里的图片内容
                        @Override
                        public void renderImage(ImageRenderInfo arg0) {
                            PdfImageObject image0;
                            try {
                                image0 = arg0.getImage();
                                byte[] imageByte = image0.getImageAsBytes();
                                Image imageInPDF = Image.getInstance(imageByte);
                                if(image0!=null && imageInPDF.equals(image)){
                                    float[] resu = new float[3];
                                    // 0 => x;  1 => y;  2 => z
                                    //z的值始终为1
                                    resu[0] = arg0.getStartPoint().get(0);
                                    resu[1] = arg0.getStartPoint().get(1);
                                    resu[2] = finalI;
                                    arrays.add(resu);
                                }
                            } catch (IOException e) {
                                e.printStackTrace();
                            } catch (BadElementException e) {
                                e.printStackTrace();
                            }

                        }

                        @Override
                        public void endTextBlock() {


                        }

                        @Override
                        public void beginTextBlock() {


                        }

                    });

                }

                pdfReader.close();

            } catch (IOException e) {

                e.printStackTrace();
            }
            return arrays;
    }

后记:此方法是获取图片的坐标与页码信息,如果想获取文本的坐标与页码信息,请把renderText()中的注释去掉,getKeyWords()的参数换一下即可。

Itext5库的对PDF文件的基本操作(一)---新建文档,设置文档属性,设置文档密码 首先引入依赖,为了方便起见,我们采用maven方式构建demo项目。在pom中添加itext库的相应依赖。 &lt;!-- https://mvnrepository.com/artifact/com.itextpdf/itextpdf --&gt; &lt;dependency&gt; &lt;groupId&gt;com.itextpdf&lt;/g... 阅读详情

相关推荐

itext5 生成pdf 使用总结

ITEXT5

欢迎来到我的博客 2万+

PDF生成

PDF生成 文章目录PDF生成POM依赖字体处理PDF内容处理生成目录事件样例展示参考文章 此版PDF生成包含: 封面, 目录,页码等功能,暂时没有实现目录跳转功能 POM依赖 <dependency> <groupId>com.itextpdf</groupId> <artifactId>layout</artifactId> <version>7.0.3</version> </dependency>

m0_58617940的博客 1020

Itext与pdfBox坐标定位问题

itext与pdfbox都可以做pdf解析工具,下面简单介绍itext与pdfbox坐标定位     itext: import java.io.IOException; import com.itextpdf.awt.geom.Rectangle2D.Float; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.t

coderdesion 1万+

java查找pdf关键字_java实现查找PDF关键字所在页码及其坐标

1、因为最近有这方面的需求,用过之后记录一下。2、此功能跟PDF中Ctrl+F性质一样,如果PDF中为图片形式的不支持定位到关键字。import com.itextpdf.awt.geom.Rectangle2D.Float;import com.itextpdf.text.pdf.PdfDictionary;import com.itextpdf.text.pdf.PdfName;import ...

weixin_31938727的博客 1364

Java使用iText库动态填充PDF模板:从坐标定位到表单填充的完整实践

PDF文档的动态生成是Java后端开发中处理合同、报告、票据等场景的常见需求。其核心原理是通过程序化操作,在预先设计好的PDF模板的指定位置插入可变数据。实现这一功能的技术价值在于能自动化、批量化地生成格式统一且内容各异的文档,极大地提升了业务处理效率。在Java生态中,iText库因其成熟稳定的API成为处理此类任务的优选方案,尤其适用于发票、证书、工单等固定格式文档的批量生成场景。本文聚焦于使用iText库的`PdfStamper`进行模板填充,详细阐述了如何通过坐标定位或`AcroFields`操作表

weixin_34226182的博客 404

Java实现PDF关键字定位与电子签章自动化

本文详细介绍了如何使用Java实现PDF关键字定位与电子签章自动化,通过iText库精准定位文档中的关键字并自动添加电子签章,大幅提升办公效率。适用于批量合同签署、标准化表单处理等场景,特别适合人力资源、财务和法务部门使用。

weixin_28363123的博客 387

【定位:PDF文件定位关键字所在坐标和页码】

iText简介: iText是著名的开放源码的站点sourceforge一个项目,是用于生成PDF文档的一个java类库。通过iText不仅可以生成PDF或rtf的文档,而且可以将XML、Html文件转化为PDF文件。 iText的安装非常方便,下载iText.jar文件后,只需要在系统的CLASSPATH中加入iText.jar的路径,在程序中就可以使用iText类库了。 iText使...

weixin_30871293的博客 896

Java实战:用iText7实现PDF关键字电子签章(附完整代码)

本文详细介绍了如何使用Java和iText7库实现基于关键字定位的PDF电子签章功能。通过解析PDF文本、精准定位关键字坐标,并动态叠加签章图像,提供了从静态定位到智能匹配的完整解决方案,附有核心代码示例,帮助开发者高效集成自动化签章能力。

weixin_29290863的博客 340

使用itext对pdf指定文字位置插入图片

使用java开源itext库对pdf进行操作,分主要分两步先查找指定文字位置,然后再在指定位置插入图片。 1.查找指定文字的坐标位置 这里主要通过实现类RenderListener来完成查找坐标位置 代码如下: package com.anyu.PDFUtils; import java.io.File; import java.io.FileInputStream; import j...

知北行的博客 1万+

Java-OpenPDF、iText与PDFBox:三大PDF处理库的实战选型指南

本文深入对比了Java-OpenPDF、iText与PDFBox三大主流PDF处理库。从核心功能、性能表现到关键的法律许可问题,提供了实战选型指南。针对不同应用场景(如简单报表、复杂合同、内容解析),给出了明确的推荐方案,帮助Java开发者根据项目需求、开发成本与合规要求,做出最合适的技术选择。

weixin_29014939的博客 320

在 Zemax 非序列模式下建立干涉仪模型

Zemax 利用其相干检测功能,将到达探测器的射线的能量相干地组合起来,同时考虑每条检测到的射线的幅度和相位。从对这些干涉条纹的定量评估来看,光学干涉仪具有广泛的应用,包括在天文学中用于测量天体的大小,在计量学中用于精确测量距离,在显微镜中用于提高分辨率,以及在物理和工程的各个领域中用于检测条件的微小变化。在光学干涉仪中,使用的是光波。非相干和相干相加的总功率是守恒的,但相干光束的峰值辐照度应该是非相干光束总和的 2 倍,这是理所当然的。请注意,条纹的缺失是显而易见的,因为不再从相干的角度观察探测器。

jkh920184196的博客 2382

Itext7生成pdf最全api总结

Itext7生成pdf最全api总结 最近使用itext7生成pdf被折磨到崩溃,一是官方文档不全,网上文章基本都是基于老版本api的,已经完全不适用itext7版本;二是itext7的api和css很像,使用java写css很让人崩溃。把我用到的做一个总结。 显示中文 itext7在使用默认字体显示中文的时候,由于默认字库不支持中文,生成的pdf中的中文会显示空白,要解决这个问题需要自己引入字体。 下载一个中文字体,我这里用的是SourceHanSansCN.ttf(只用过ttf文件,不知道是否支

gairuichan的博客 1万+

如何使你的直流电机闭环?(PID讲解)

看了看很多大佬写的PID讲解很全面也很复杂,实在是不适合很多萌新入坑,所以想按自己的理解写一篇通俗易懂的PID算法讲解

a2001444的博客 1万+

根据关键字位置为PDF添加文本和图片

首先引入ITEXT5的jar包 1、存放根据关键字查找位置后的信息: public class TextLocal { /** * 关键字在PDF中的X坐标 */ private float x; /** * 关键字在PDF中的Y坐标 */ private float y; /** * 关键字在PDF中的页码 */ private int pageNum; /** ..

走马川行雪的博客 1736

现场总线课程设计-基于modbus协议使用QT实现主从站控制通信

【平台:QT】 【协议:modbus(注:由于要求,需要自己来实现modbus库,而非直接调用已有的库)】 【由于复制粘贴,时间原因可能格式有误,如需要具体工程文件以及报告文件请私信博主】 1、 大作业任务: (1)使用附件中工具软件体验MODBUS主从站数据传输过程(可在主从站模拟工具里面观察各功能码对应数据帧内容并对其进行分析) (2)使用串口调试助手,手工发出MODBUS主、从站该发出的数据,并观察对方发出的数据 (3)实现MODBUS主、从站功能,描述实现过程(语言不限于使用VC

weixin_44469597的博客 4066

72、海洋地理信息系统:电子海图的全面解析

本文全面解析了海洋地理信息系统中的电子海图技术,从AIS数据的应用、电子海图数据的存储与显示,到电子导航的发展趋势和S-100通用水文数据模型的推广,系统地阐述了电子海图在现代航海中的核心作用及其未来发展方向。

hhh00的博客 252

iText 页码、页眉、页脚工具

iText页码,页眉,页脚 DEMO下载及实现:https://download.youkuaiyun.com/download/iosweb/10623375 1,页码工具类 package excelPOI; import java.io.IOException; import com.itextpdf.text.Document; import com.itextpdf.text.Doc...

IOS_Mainstay的博客 1378

基于Simulink的电源纹波抑制仿真

电源纹波(Power Supply Ripple)是指直流电源输出中存在的交流分量。纹波的存在会导致电压波动,进而影响负载设备的性能和寿命。为了确保高质量的电源输出,通常需要设计有效的滤波电路来抑制纹波。Simulink 提供了一个强大的仿真环境,可以用来设计、分析和验证电源纹波抑制方案。本教程将详细介绍如何使用 Simulink 进行电源纹波抑制的仿真实例。通过本教程,我们详细介绍了如何使用 Simulink 进行电源纹波抑制的仿真实例。背景介绍:理解电源纹波及其对电力电子系统的影响。仿真建模过程。

xiaoheshang_123的博客 514

itext 在已知页码的情况下,往pdf中添加图片,实测有效,下面贴出代码

最近项目中非要在已经生成的pdf中添加二维码,网上搜索一把,终于找到一个合适点的,不过这个不灵活,不过却能解决我的问题,我就想在第一页某个位置插入一张图片而已,就这么简单,只要不覆盖原来pdf中的内容就行了。下面是代码: /**  * @author Administrator  *  */ package pdf; import java.io.File; import java.io.Fil...

qq_20423863的博客 1307

腾讯面试——机器学习岗面试总结

先写合并两个有序数组,接着写合并n个有序的数组,假设总共m个数,讲了一个思路两两合并直到只剩下一个数组,分析一下时间复杂度(MlogN),面试官不满意,然后想了一下说了另一个思路,用n个指针开始指向各个数组的首端,用一个优先队列维护他们的最小值,每次拿出最小值的指针然后插入该指针的下一个值。感觉跟二面面试官聊得还是挺开心的,他详细地介绍了他们部门所做的业务,然后问了一下什么时候能来实现,我说只能暑假七八两个月,他觉得有点晚,这样子不利于转正,有些人都实习半年的,回去讨论一下,正式批之前给我答复。

FPGA/MATLAB学习教程/源码/项目合作开发 1232

内存越界一定会导致程序崩溃吗?详解内存越界

本文详细解释了内存越界不一定导致内存越界的问题,全面介绍了C++内存越界的相关内容。

dvlinker的技术专栏 2万+

canvas 添加 竖版文字_使用itext在pdf指定页面的指定位置添加图片与汉字

本文源码路径:https://github.com/jedyang/demo在指定页码的指定位置插入文字 在指定页码的指定位置插入文字属于常规操作,比较简单。但是如果要支持中文,需要多做一点操作。而且有坑要踩。 首先引入汉语系语言包。(非必须,后面讲)com.itextpdffont-asian${itext.version} 代码如下: publicvoidaddTextAb...

weixin_39888943的博客 1236

微信小程序|基于小程序+云开发制作一个租房小程序

经济发展的同时伴随着大批人群的流动,租房需求一直是持久不衰的话题,如何租好房,好租房,跟随此文一起制作一个租房小程序,让租房不再困难。

商务合作 / 项目定制 / 学习交流。个人vx:lovely_wml 4930

Java PDF坐标提取文本实战:基于PDFBox与OCR的高精度数据抽取

在数据处理与自动化办公场景中,PDF文档解析是常见的技术需求。其核心原理在于解析PDF内部结构,定位文本元素的空间位置信息。这项技术的价值在于能够将非结构化的PDF文档转化为结构化数据,极大提升信息处理效率。它广泛应用于财务报表解析、合同关键信息抽取、发票自动化处理等模板化文档处理场景。本文聚焦于通过坐标定位实现高精度文本抽取,详细探讨了Apache PDFBox的坐标遍历与筛选机制,并针对扫描件PDF介绍了结合Tesseract OCR的混合方案,为Java开发者提供了一套稳定、高效的解决方案。

weixin_34082789的博客 470

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

上一篇: ITEXT-插入水印(itext-pdfa-5.5.6.jar)
下一篇: ITEXT-小图片并排显示,大图片按行显示
sand_clock
博客等级 码龄11年 66粉丝 89原创
评论 12
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值