3.4_1 java自制小工具 - pdf批量转图片

相关链接

  • 目录
  • 参考文章:pdf转图片(apache pdfbox)
  • 参考文章:GUI界面-awt
  • 参考文章:jar包转exe(exe4j)
  • 参考文章:IDEA导入GIT项目
  • 参考文章:IDEA中使用Gitee管理代码
  • gitee项目链接:pdf_2_image
  • 网盘地址:.jar文件,提取码: ppwr
  • 网盘地址:.exe文件,提取码:jp3y

背景介绍

  最近做标书,涉及到很多批量pdf文件要转图片,再将插入word的使用场景,大概几千份,本着能省就省的原则,下载了四五个app,基本都是要收费,永久会员50~600不等,不付费会受到各种功能限制(禁用批量功能、单个文件页数限制)。
  自己尝试写个小工具,由于之前做的小工具都是打成jar包,只能在有jre环境的电脑上黑窗口操作。这次转为exe文件,用到的GUI和exe4j属于新的尝试,最终效果还比较满意。

在这里插入图片描述
在这里插入图片描述


  • 开发流程

    • 1.单个pdf转图片:Apache PDFbox 开源包,实现pdf转单个图片。
    • 2.批量pdf转图片:结合上面功能,实现批量转文件。
    • 3.GUI可视化界面:awt,设计思路类似于大学的vb编程课,实现界面操作。
    • 4.exe可执行文件:exe4j,可以不安装jre环境,windows系统下双击即可运行。

    两处避坑:
      1. macos M1芯片下载后使用不了,换了台windows才运行成功。
      2. 下载时默认exe4j 9.0,应该是指对应的版本为java9及以上。我的项目使用jdk8,就要下载exe4j 8.0版本,否则会卡在其中一步,点下一步没有反应,进行不下去。
    在这里插入图片描述

      卡住的位置:
    在这里插入图片描述

    • 5.自适应:写死分辨率容易导致在分辨率较高的屏幕下,窗口非常小,通过获取屏幕尺寸,按比例计算各个组件坐标、长宽,实现自适应大小。

  • 功能示例
    • 1.设置dpi清晰度(100~600)
    • 2.图片格式(jpg和png)
    • 3.自动遍历子目录按照 原文件名_序号 格式生成对应图片
      在这里插入图片描述

源码

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>pdf_2_image</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>8</maven.compiler.source><maven.compiler.target>8</maven.compiler.target></properties><dependencies><!--pdf2jpg--><dependency><groupId>org.apache.pdfbox</groupId><artifactId>fontbox</artifactId><version>2.0.9</version></dependency><!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --><dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.9</version></dependency><!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --><dependency><groupId>commons-logging</groupId><artifactId>commons-logging</artifactId><version>1.2</version></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-shade-plugin</artifactId><version>1.4</version><executions><execution><phase>package</phase><goals><goal>shade</goal></goals><configuration><filters><filter><artifact>*:*</artifact><excludes><exclude>META-INF/*.SF</exclude><exclude>META-INF/*.DSA</exclude><exclude>META-INF/*.RSA</exclude></excludes></filter></filters><transformers><transformerimplementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"><!-- 程序主入口 --><mainClass>com.groupies.Pdf2ImageIteratorWindowsAdaptive</mainClass></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.handlers</resource></transformer><transformerimplementation="org.apache.maven.plugins.shade.resource.AppendingTransformer"><resource>META-INF/spring.schemas</resource></transformer></transformers></configuration></execution></executions></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>2.3.1</version><configuration><source>1.8</source><target>1.8</target><encoding>utf-8</encoding></configuration></plugin></plugins></build>
</project>

Pdf2ImageIteratorWindowsAdaptive

package com.groupies;import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;/*** @author GroupiesM* @date 2023/11/30* @version 1.2* @introduction pdf转图片工具类,awt可视化界面,会自动遍历所有子目录,窗口大小自适应*/
public class Pdf2ImageIteratorWindowsAdaptive {//公共变量static String filePath;//基础路径static String fileName;//文件名称//用户输入static Integer dpiInput;//dpi清晰度static String imageTypeInput;//图片类型static File fileUrl;//文件目录//循环相关static Integer taskCount = 0;//任务数量static Integer imageCount = 0;//图片数量//主体static Frame frame = new Frame("pdf转图片小工具 -- by GroupiesM");//控制台static TextArea textAreaConsole = new TextArea("");static StringBuffer sb = new StringBuffer("");//按比例获取尺寸static Toolkit toolkit = Toolkit.getDefaultToolkit();static int frameWidth = toolkit.getScreenSize().width * 2 / 5;//宽static int frameHeight = toolkit.getScreenSize().height * 19 / 20;//高static int leftEdge = frameWidth / 10;//左边距static int elementWidth = frameWidth * 4 / 5;//组件宽度static int elementHeight = frameWidth / 20;//组件宽度//字体static Font titleFontLabel = new Font("黑体", Font.BOLD, Math.max((frameWidth / 55), 12));//标签样式static Font bodyFontLabel = new Font("宋体", Font.PLAIN, Math.max((frameWidth / 55), 12));//标签样式/*** @param args* @introduction 程序入口*/public static void main(String[] args) {textAreaConsole.setText("介绍:\nhttps://blog.csdn.net/qq_43529621/article/details/134758957");initGUI();}/*** @param folder* @introduction 遍历目录中的所有pdf、子目录中的所有pdf,发现pdf文件则调用pdf2png方法转换pdf文件为png*/public static void traverseFolder(File folder) {if (folder.isDirectory()) {File[] files = folder.listFiles();if (files != null) {for (File file : files) {if (file.isDirectory()) {traverseFolder(file); // 递归遍历子文件夹} else if (file.getAbsolutePath().endsWith(".pdf")) {//如果是pdf文件,转图片filePath = folder.getAbsolutePath();//文件目录fileName = file.getName();//文件名sb.append("------------Task" + ++taskCount + "------------\r\n");sb.append("目录:" + folder.getAbsolutePath() + "\r\n");sb.append("文件:" + file.getAbsolutePath() + "\r\n");textAreaConsole.setText(sb.toString());System.out.println("------------Task" + taskCount + "------------");System.out.println("目录:" + folder.getAbsolutePath());System.out.println("文件:" + file.getAbsolutePath());try {pdf2png(filePath, filePath, fileName, imageTypeInput);} catch (Exception e) {//e.printStackTrace();sb.append(e.getMessage() + "\r\n");textAreaConsole.setText(sb.toString());}}}}} else {System.out.println("路径有误,请重新输入");}}/*** @introduction 使用pdfbox将整个pdf转换成图片* @param sourceDirectory* @param targetDirectory* @param filename* @param type 图片类型 png 和jpg* @throws Exception*/public static void pdf2png(String sourceDirectory, String targetDirectory, String filename, String type) throws Exception {long startTime = System.currentTimeMillis();// 将文件地址和文件名拼接成路径 注意:线上环境不能使用\\拼接File file = new File(sourceDirectory + "/" + filename);try {// 写入文件PDDocument doc = PDDocument.load(file);PDFRenderer renderer = new PDFRenderer(doc);int pageCount = doc.getNumberOfPages();for (int i = 0; i < pageCount; i++) {// dpi为144,越高越清晰,转换越慢BufferedImage image = renderer.renderImageWithDPI(i, dpiInput); // Windows native DPI// 将图片写出到该路径下sb.append("图片" + ++imageCount + ":" + targetDirectory + "/" + filename.replace(".pdf", "") + "_" + (i + 1) + "." + type + "\r\n");textAreaConsole.setText(sb.toString());System.out.println("图片" + imageCount + ":" + targetDirectory + "/" + filename.replace(".pdf", "") + "_" + (i + 1) + "." + type);File imageTarget = new File(targetDirectory + "/" + filename.replace(".pdf", "") + "_" + (i + 1) + "." + type);//覆盖写文件ImageIO.write(image, type, imageTarget);}long endTime = System.currentTimeMillis();//结束时间doc.close();//关流,否则会报异常 Warning: You did not close a PDF Documentsb.append("共耗时:" + ((endTime - startTime) / 1000.0) + "秒\r\n");textAreaConsole.setText(sb.toString());System.out.println("共耗时:" + ((endTime - startTime) / 1000.0) + "秒");  //转化用时} catch (IOException e) {e.printStackTrace();sb.append(e.getMessage());textAreaConsole.setText(sb.toString());}}/*** @introduction 初始化GUI页面*/public static void initGUI() {//todo 0.创建窗口Frameframe.setVisible(true);frame.setSize(frameWidth, frameWidth * 203 / 200);//设置大小frame.setBackground(new Color(88, 87, 86));//窗口背景色frame.setLayout(null);//todo 1.1 《dpi》标签Label labelDpi = new Label("  一、dpi分辨率(越高越清晰,转换越慢)");labelDpi.setBounds(leftEdge, elementHeight * 3 / 2, elementWidth, elementHeight);//设置位置、大小labelDpi.setBackground(Color.darkGray);//背景色labelDpi.setForeground(Color.WHITE);//字体颜色labelDpi.setFont(titleFontLabel);frame.add(labelDpi);//给窗口添加组件//todo 1.2 《dpi》滚动条Scrollbar scrollbarDpi = new Scrollbar(Scrollbar.HORIZONTAL, 144, elementHeight, 100, 600 + elementHeight); //构造一个具有指定方向,初始值,粗细、最小值、最大值的新滚动条scrollbarDpi.setBounds(leftEdge * 3 / 2, elementHeight * 27 / 10, elementWidth / 2, elementHeight * 2 / 3);//设置位置、大小frame.add(scrollbarDpi);//给窗口添加组件//todo 1.3《dpi回显》标签Label labelDpiValue = new Label("\t\t144");labelDpiValue.setBounds(leftEdge * 3 / 2 + elementWidth / 2, elementHeight * 27 / 10, leftEdge, elementHeight * 2 / 3);//设置位置、大小labelDpiValue.setForeground(Color.WHITE);//字体颜色labelDpiValue.setBackground(Color.darkGray);//字体颜色labelDpiValue.setFont(bodyFontLabel);frame.add(labelDpiValue);//给窗口添加组件//todo 1.4《dpi》滚动条背景Label labelDpiBackGround = new Label();labelDpiBackGround.setBounds(leftEdge, elementHeight * 5 / 2, elementWidth, elementHeight * 6 / 5);//设置大小labelDpiBackGround.setBackground(Color.darkGray);//背景色frame.add(labelDpiBackGround);//给窗口添加组件//todo 2.1《转换类型》标签Label labelImageType = new Label("  二、图片类型(jpg:有损压缩;png:无损压缩)");labelImageType.setBounds(leftEdge, elementHeight * 21 / 5, elementWidth, elementHeight);//设置大小labelImageType.setBackground(Color.darkGray);//设置标签背景色labelImageType.setForeground(Color.white);//设置标签背景色labelImageType.setFont(titleFontLabel);frame.add(labelImageType);//add()给窗口添加标签//todo 2.2《转换类型》单选框CheckboxGroup boxImageType = new CheckboxGroup();Checkbox ck1 = new Checkbox("jpg", boxImageType, true);Checkbox ck2 = new Checkbox("png", boxImageType, false);ck1.setBounds(leftEdge * 3 / 2, elementHeight * 26 / 5, leftEdge * 3 / 2, elementHeight);ck2.setBounds(leftEdge * 6 / 2, elementHeight * 26 / 5, leftEdge * 3 / 2, elementHeight);ck1.setForeground(Color.white);ck2.setForeground(Color.white);ck1.setBackground(Color.darkGray);ck2.setBackground(Color.darkGray);ck1.setFont(bodyFontLabel);ck2.setFont(bodyFontLabel);frame.add(ck1);//给窗口添加组件frame.add(ck2);//给窗口添加组件//todo 2.3《转换类型》背景Label labelImageTypeBackGround = new Label();labelImageTypeBackGround.setBounds(leftEdge, elementHeight * 26 / 5, elementWidth, elementHeight * 6 / 5);//设置大小labelImageTypeBackGround.setBackground(Color.darkGray);//背景色frame.add(labelImageTypeBackGround);//给窗口添加组件//todo 3.1《目录》标签LabelLabel labelUrl = new Label("  三、文件路径,例如:C:\\Users\\GroupiesM\\Desktop");labelUrl.setBounds(leftEdge, elementHeight * 7, elementWidth, elementHeight);//设置大小labelUrl.setBackground(Color.darkGray);//背景色labelUrl.setForeground(Color.WHITE);//字体颜色labelUrl.setFont(titleFontLabel);frame.add(labelUrl);//给窗口添加组件//todo 3.2《目录》输入框TextField textUrl = new TextField(elementHeight);textUrl.setText("C:\\Users\\GroupiesM\\Desktop");textUrl.setFont(bodyFontLabel);textUrl.setBounds(leftEdge, elementHeight * 8, elementWidth, elementHeight);frame.add(textUrl);//给窗口添加组件//todo 4《清空》按钮Button buttonClean = new Button("清空");//创建按钮buttonClean.setBounds(leftEdge * 2, elementHeight * 19 / 2, leftEdge * 7 / 5, elementHeight * 7 / 5);//设置位置buttonClean.setFont(titleFontLabel);frame.add(buttonClean);//给窗口添加组件//todo 5《转换》按钮Button buttonTransform = new Button("转换");//创建按钮buttonTransform.setBounds(leftEdge * 22 / 5, elementHeight * 19 / 2, leftEdge * 7 / 5, elementHeight * 7 / 5);//设置位置buttonTransform.setFont(titleFontLabel);frame.add(buttonTransform);//给窗口添加组件//todo 6《退出》按钮Button buttonExit = new Button("退出");//创建按钮buttonExit.setBounds(leftEdge * 34 / 5, elementHeight * 19 / 2, leftEdge * 7 / 5, elementHeight * 7 / 5);//设置位置buttonExit.setFont(titleFontLabel);frame.add(buttonExit);//给窗口添加组件//todo 7《控制台》textAreaConsole.setBounds(leftEdge, elementHeight * 113 / 10, elementWidth, elementHeight * 9);//设置大小textAreaConsole.setBackground(Color.white);//背景色textAreaConsole.setForeground(Color.black);//背景色textAreaConsole.setFont(bodyFontLabel);frame.add(textAreaConsole);//给窗口添加组件//todo 7.1《dpi滚动条》触发动作scrollbarDpi.addAdjustmentListener(e -> labelDpiValue.setText(String.valueOf("\t\t" + scrollbarDpi.getValue())));//回显滚动条//todo 7.2 《清空》触发动作buttonClean.addActionListener(actionEvent -> textUrl.setText("\b"));//清空输入框//todo 7.3 《转换》触发动作buttonTransform.addActionListener(actionEvent -> startTransform(scrollbarDpi, boxImageType, textUrl));//开始转换,并校验//todo 7.4 《退出》触发动作buttonExit.addActionListener(Pdf2ImageIteratorWindowsAdaptive::actionPerformed);//frame.pack();}/*** @introduction 开始转换,初始化参数,校验文件目录是否存在* @param scrollbarDpi dpi清晰度* @param group 图片类型,单选框* @param textUrl 文件目录*/public static void startTransform(Scrollbar scrollbarDpi, CheckboxGroup group, TextField textUrl) {dpiInput = scrollbarDpi.getValue();//设置dpiimageTypeInput = group.getSelectedCheckbox().getLabel();//设置图片类型fileUrl = new File(textUrl.getText().trim());//创建文件//如果目录不存在,不执行指令if (!fileUrl.exists()) {textUrl.setForeground(Color.red);if (!textUrl.getText().trim().endsWith("(路径不存在)")) textUrl.setText(textUrl.getText().trim() + "(路径不存在)");textUrl.selectAll();return;}//校验通过textUrl.setForeground(Color.black);//初始化参数sb = new StringBuffer();taskCount = 0;//任务数量imageCount = 0;//图片数量//开始转换traverseFolder(fileUrl);}/*** @introduction 退出按钮, 监听* @param e*/private static void actionPerformed(ActionEvent e) {sb = initSB();textAreaConsole.setText("....................正在退出.....................\n" +"===============================================\n" +sb.toString());try {Thread.sleep(1600);} catch (InterruptedException ex) {ex.printStackTrace();}sb = initSB();textAreaConsole.setText("....................正在退出.....................\n" +"===============================================\n" +sb.reverse().toString());try {Thread.sleep(1300);} catch (InterruptedException ex) {ex.printStackTrace();}System.exit(0);}/*** @introduction 退出程序-控制台* @return StringBuffer*/public static StringBuffer initSB() {sb = new StringBuffer();sb.append("                     _oo0oo_                    \n");sb.append("                    o8888888o                    \n");sb.append("                    88” . “88                    \n");sb.append("                   ( |- _ - | )                    \n");sb.append("                   O \\  =  / O                    \n");sb.append("                  __/ ‘---’ \\__                    \n");sb.append("                  '\\|       |/'                    \n");sb.append("              / \\\\|||   :   |||// \\                    \n");sb.append("            / _|||||  -卍- |||||_  \\                    \n");sb.append("           |    |\\\\\\   -    ///  |_ \\                     \n");sb.append("           |  \\_|  ''\\---/''    |_/  |                    \n");sb.append("           \\ ,-\\__    '-'    __/- ,  /              \n");sb.append("          ___'.  .'  /--.--\\   '.  .'___               \n");sb.append("          .”“'< ‘.___\\_<|>_/___.'> ' ”“.             \n");sb.append("         | | : '-\\'.:'\\ _ /' : .'/ - ': | |            \n");sb.append("          \\ \\ '_. \\_ __\\ /__ _/  , - ' / /           \n");sb.append("     ====='-.___'.___ \\____//___.-' ___.-' =====           \n");sb.append("                      '=----='           \n");sb.append("                                                             \n");return sb;}
}

23/12/3

M

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/209184.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于CW32F030单片机的便携式多功能测试笔

一、产品背景 在日常的硬件调试工作中&#xff0c;我们最常使用的仪器仪表可能就是万用表了&#xff0c;虽然万用表号称“万用”&#xff0c;但大部分时候&#xff0c;我们需要使用到的功能无非是电压测量和通断测量。 作为调试的“得力干将”&#xff0c;万用表有时候也会存…

华为手环配置技巧

前言 华为手环作为生活健康辅助设备发挥不可忽视的作用&#xff0c;但每次更换手环后需要重新配置。华为手环不仅有健康监测、消息通知、天气推送、离线支付、公交卡、运动锻炼、等功能&#xff0c;还有倒计时、计时器、手电筒、闹钟、等小工具。下文介绍如何进行配置。 配置…

【富文本编辑器】原生JS使用WangEditor和vue上传图片前后端demo

【富文本编辑器】原生JS使用WangEditor上传图片前后端demo 第一步 HTML 第二步 初始化WangEditor与图片上传回调函数 第三步 后端返回数据体封装 第四步 后端接口上传图片&#xff0c;并返回图片地址 最近&#xff0c;我遇到了这样一个问题&#xff1a;因为我们的项目是基于…

什么是跨站脚本攻击

跨站脚本攻击 1. 定义2. 跨站脚本攻击如何工作3. 跨站脚本攻击类型4. 如何防止跨站脚本攻击 1. 定义 跨站脚本攻击&#xff08;Cross-site Scripting&#xff0c;通常称为XSS&#xff09;&#xff0c;是一种典型的Web程序漏洞利用攻击&#xff0c;在线论坛、博客、留言板等共享…

分页助手入门以及小bug,报sql语法错误

导入坐标 5版本以上的分页助手 可以不用手动指定数据库语言&#xff0c;它会自动识别 <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.3.2</version> </dependency&g…

从 Elasticsearch 到 SelectDB,观测云实现日志存储与分析的 10 倍性价比提升

作者&#xff1a;观测云 CEO 蒋烁淼 & 飞轮科技技术团队 在云计算逐渐成熟的当下&#xff0c;越来越多的企业开始将业务迁移到云端&#xff0c;传统的监控和故障排查方法已经无法满足企业的需求。在可观测理念逐渐深入人心的当下&#xff0c;人们越来越意识到通过多层次、…

[C/C++]数据结构 关于二叉树的OJ题(利用分治思想解决难题)

题目一: 单值二叉树 &#x1f6a9;⛲&#x1f31f;⚡&#x1f966;&#x1f4ac; &#x1f6a9;题目链接:力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 ⛲题目描述: 如果二叉树每个节点都具有相同的值&#xff0c;那么该二叉树就是单值二叉树。…

vivado实现分析与收敛技巧7-布局规划

关于布局规划 布局规划有助于设计满足时序要求。当设计难以始终如一满足时序要求或者从未满足时序要求时 &#xff0c; AMD 建议您执行布局规划。如果您与设计团队协作并且协作过程中一致性至关重要&#xff0c; 那么布局规划同样可以发挥作用。布局规划可通过减少平均布线延…

锁表的原因及解决办法

引言 作为开发人员&#xff0c;我们经常会和数据库打交道。 当我们对数据库进行修改操作的时候&#xff0c;例如添加字段&#xff0c;更新记录等&#xff0c;没有正确评估该表在这一时刻的使用频率&#xff0c;直接进行修改&#xff0c;致使修改操作长时间无法响应&#xff0…

Spring Boot Actuator 2.2.5 基本使用

1. pom文件 &#xff0c;添加 Actuator 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> 2.application.properties 文件中添加以下配置 …

自动驾驶学习笔记(十三)——感知基础

#Apollo开发者# 学习课程的传送门如下&#xff0c;当您也准备学习自动驾驶时&#xff0c;可以和我一同前往&#xff1a; 《自动驾驶新人之旅》免费课程—> 传送门 《Apollo Beta宣讲和线下沙龙》免费报名—>传送门 文章目录 前言 传感器 测距原理 坐标系 标定 同…

基于Java SSM框架+Vue实现企业公寓后勤管理系统项目【项目源码+论文说明】

基于java的SSM框架Vue实现企业宿舍后勤管理网站演示 摘要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所…

Linux系统-----进程通讯

前言 本期我们来学习进程间的通讯&#xff0c;不同进程之间是可以去通过信号来去实现通讯交流的&#xff0c;下面我们就一起来看看多进程之间的通讯方式。 一、信号机制 1、信号的基本概念 每个信号都对应一个正整数常量(称为signal number,即信号编号。定义在系统头文件<…

Google Chrome访问出现 NET::ERR_CERT_INVALID

Google Chrome访问出现 NET::ERR_CERT_INVALID然后访问不了当前网站&#xff0c;这个是由于证书失效了&#xff0c;临时解决方式是&#xff1a; 第一种方案&#xff1a; 在Chrome提示“您的连接不是私密连接”页面的空白区域点击一下&#xff0c;然后输入“thisisunsafe”(页…

PHP开源问答网站平台源码系统 源码全部开源可二次开发 附带完整的搭建教程

目前&#xff0c;问答网站已经成为人们获取知识、交流思想的重要平台。然而&#xff0c;对于许多开发者来说&#xff0c;从头开始构建一个问答网站可能会面临各种挑战。今天&#xff0c;小编给大家介绍一款基于PHP的开源问答网站平台源码系统&#xff0c;它不仅源码全部开源&am…

基于Java SSM框架+Vue实现教学视频点播网站项目【项目源码+论文说明】计算机毕业设计

基于java的SSM框架Vue实现教学视频点播网站演示 摘要 随着现在网络的快速发展&#xff0c;网上管理系统也逐渐快速发展起来&#xff0c;网上管理模式很快融入到了许多学院的之中&#xff0c;随之就产生了“视频点播系统”&#xff0c;这样就让视频点播系统更加方便简单。 对于…

基于hadoop下的Kafka分布式安装

简介 Kafka是一种分布式流处理平台&#xff0c;它具有高吞吐量、可扩展性、可靠性、实时性和灵活性等优点。它能够支持每秒数百万条消息的传输&#xff0c;并且可以通过增加节点来增加吞吐量和存储容量。Kafka通过将数据复制到多个节点来实现数据冗余和高可用性&#xff0c;即使…

Difference between getc(), getchar(), and gets()

getc(): 从输入中只能读单个字符 getchar()&#xff1a;从标准输入流中输入都单个字符。 两者基本等同&#xff0c;唯一不一样的是getc()是任何输入流&#xff0c;而getchar()是标准输入流。 gets:可以读入含有空格的字符串 // Example for getc() in C #include <stdio.h…

uniapp-从后台返回的一串地址信息上,提取省市区进行赋值

1.这是接口返回的地址信息 2.要实现的效果 3.实现代码&#xff1a; <view class"address">{{item.address}}</view>listFun() {let url this.$url.url.positionInfoCompany;let param {page: this.page,limit: this.limit,keyword: this.keyword,};thi…

6-13连接两个字符串

#include<stdio.h> int main(){int i0,j0;char s1[222],s2[333];printf("请输入第一个字符串&#xff1a;\n");gets(s1);//scanf("%s",s1);printf("请输入第二个字符串&#xff1a;\n");gets(s2);while(s1[i]!\0)i;while(s2[j]!\0)s1[i]s2…