当前位置: 首页 > news >正文

Java如何实现PDF转高质量图片

在这里插入图片描述
大家好,我是 V 哥。在Java中,将PDF文件转换为高质量的图片可以使用不同的库,其中最常用的库之一是 Apache PDFBox。通过该库,你可以读取PDF文件,并将每一页转换为图像文件。为了提高图像的质量,你可以指定分辨率等参数。此外,也可以结合 Java ImageIO 来保存生成的图片文件。

如何实现

下面V哥通过一个详细的案例,来展示如何使用 PDFBox 实现 PDF 转高质量图片:

所需依赖

首先,确保你已经在项目中添加了 PDFBox 依赖。你可以通过Maven来添加:

<dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version>2.0.29</version> <!-- 确保使用最新的版本 -->
</dependency>

实现步骤

先来捋一下实现步骤哈。

  1. 加载 PDF 文件
  2. 设置渲染参数(如 DPI 来控制图片分辨率)
  3. 将每页 PDF 渲染为图片
  4. 保存图片

通过以上1,2,3,4个步骤,咱们具体来实现一下代码:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;public class VGPdfToImage {public static void main(String[] args) {// PDF文件路径String pdfFilePath = "path/to/your/pdf/vg_doc.pdf";// 输出图片文件夹路径String outputDir = "path/to/output/images/";// 设置DPI(越高图片越清晰,但文件也会更大)int dpi = 300;try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {PDFRenderer pdfRenderer = new PDFRenderer(document);// 遍历PDF每一页并转换为图片for (int page = 0; page < document.getNumberOfPages(); ++page) {// 使用BufferedImage来表示图像BufferedImage bim = pdfRenderer.renderImageWithDPI(page, dpi);// 生成文件名String fileName = outputDir + "pdf_page_" + (page + 1) + ".png";// 将图片保存为PNG格式ImageIO.write(bim, "png", new File(fileName));System.out.println("Saved page " + (page + 1) + " as image.");}} catch (IOException e) {e.printStackTrace();}}
}

来解释一下

  1. PDFRenderer: PDFBox 提供的 PDFRenderer 类用于将 PDF 文档页渲染为图像对象(BufferedImage)。
  2. renderImageWithDPI: 该方法可以指定DPI(每英寸点数),它直接影响图片的分辨率。通常,72 DPI 是屏幕显示的默认分辨率,而300 DPI 被视为高质量打印的分辨率。
  3. ImageIO: Java的 ImageIO 用于将 BufferedImage 保存为 PNG、JPEG 等常见图片格式。

输出效果

  • 每一页的PDF将被单独渲染为一张图片,并且通过高DPI参数设置,图片的质量较高。
  • 输出的文件路径为 outputDir 指定的路径,图片将被保存为PNG格式。你也可以更改保存格式为JPEG等。

可调整的项有

  • DPI 设置: 如果你希望输出更高质量的图片,可以将 DPI 设置为 300 或更高。如果需要快速渲染且质量要求不高,可以设置为72 DPI。
  • 图片格式: ImageIO.write() 可以使用不同的格式,如 "jpg""png",根据需求调整。

注意一下,确保你的PDFBox库版本是较新的版本,如2.x系列,来保证支持更多的PDF功能和修复潜在问题。

以上就是一个简单的实现过程DEMO,那在实际应用中,一定会有特定问题,问题来了,如何你要处理的 PDF 文件比较大,或者页数比较多,那必定是要考虑性能问题滴。就这两个问题,V 哥来优化一下。

两个可能的性能优化问题

  1. 缓存策略:对于较大的 PDF 文件,你可以使用某些缓存策略来优化性能。
  2. 并行处理:如果你需要处理很多页的 PDF,可以通过多线程并行处理每一页以提升速度。

缓存策略优化

当要处理较大的 PDF 文件时,咱们使用缓存策略可以显著优化性能,特别是对于那些需要处理多个页面或反复渲染的情况。对于 PDF 渲染操作,缓存策略主要是为了减少对磁盘或内存的反复访问,从而加快读取、渲染速度并节省内存。

在 Java 中,可以通过以下几种方式实现缓存优化:

  1. 内存缓存:将已处理的页面保存在内存中,当需要重复访问这些页面时直接从缓存中获取。
  2. 磁盘缓存:如果内存不足以缓存所有页面,可以将页面渲染结果或部分中间数据缓存到磁盘上。
  3. 逐页处理:只在需要时加载并处理某些页面,而不是一次性加载整个PDF文件。

采用实现内存缓存的案例

采用内存缓存,咱们可以使用 ConcurrentHashMap 来实现,将已经渲染的 PDF 页面存储在内存中,避免重复渲染。

来看一个使用内存缓存的详细实现案例:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ConcurrentHashMap;public class PdfToImageWithCache {// 用于缓存已渲染的PDF页面(使用ConcurrentHashMap确保线程安全)private static final ConcurrentHashMap<Integer, BufferedImage> imageCache = new ConcurrentHashMap<>();private static final int dpi = 300; // 高质量DPI设置public static void main(String[] args) {// PDF文件路径String pdfFilePath = "path/to/your/large/pdf/ vg_doc.pdf";// 输出图片文件夹路径String outputDir = "path/to/output/images/";try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {PDFRenderer pdfRenderer = new PDFRenderer(document);// 获取页面总数int totalPages = document.getNumberOfPages();System.out.println("Total pages: " + totalPages);// 渲染并缓存每一页for (int page = 0; page < totalPages; ++page) {BufferedImage image = renderPageWithCache(pdfRenderer, page);// 保存图片String fileName = outputDir + "pdf_page_" + (page + 1) + ".png";ImageIO.write(image, "png", new File(fileName));System.out.println("Saved page " + (page + 1) + " as image.");}} catch (IOException e) {e.printStackTrace();}}/*** 使用缓存渲染PDF页面* @param pdfRenderer PDFRenderer实例* @param page 页码(从0开始)* @return 缓存或渲染后的BufferedImage*/private static BufferedImage renderPageWithCache(PDFRenderer pdfRenderer, int page) throws IOException {// 检查缓存是否已存在该页面的图像if (imageCache.containsKey(page)) {System.out.println("Page " + (page + 1) + " found in cache.");return imageCache.get(page);}// 如果缓存中不存在,则渲染并存入缓存System.out.println("Rendering page " + (page + 1) + "...");BufferedImage image = pdfRenderer.renderImageWithDPI(page, dpi);imageCache.put(page, image);return image;}
}
解释一下代码
  1. 内存缓存(ConcurrentHashMap:

    • 使用 ConcurrentHashMap<Integer, BufferedImage> 作为缓存结构,Integer 代表页面的索引(从0开始),BufferedImage 代表已渲染的图像。
    • 每次渲染页面前,先检查缓存中是否存在该页面的图像,如果已存在,则直接返回缓存的图像,否则渲染并保存到缓存中。
  2. renderPageWithCache 方法:

    • 该方法首先检查页面是否在缓存中,如果在,则直接从缓存中获取。
    • 如果缓存中不存在该页面的图像,则渲染并将其保存到缓存中。
  3. DPI 设置:

    • dpi 参数设置为300以确保输出的图像质量足够高。
  4. 逐页渲染:

    • 使用 for 循环逐页处理,避免一次性加载所有页面到内存。对于每页图像的渲染,若该页面已经渲染过,则直接从缓存中获取。
这样优化的好处是啥
  1. 内存缓存的好处:

    • 当你需要多次访问或保存某些页面时,内存缓存可以避免重复渲染,从而提升性能。
    • 对于较大的PDF文件,如果反复操作相同的页面,缓存能显著减少处理时间。
  2. 并发支持:

    • ConcurrentHashMap 保证了在多线程环境下缓存操作的安全性,可以安全地在多线程中使用。
  3. 控制内存占用:

    • 如果内存使用量过大,可以根据情况定期清理缓存,或者在缓存中限制最大保存数量,使用类似LRU(最近最少使用)策略来清除旧缓存。

实现磁盘缓存的案例

接下来,咱们看一个使用磁盘缓存要怎么实现,如果 PDF 文件较大,内存无法保存全部页面的图像,我的天啊,那要怎么办?就是可以使用磁盘缓存,将渲染结果暂时保存到磁盘。

来看下面这个磁盘缓存策略实现,将渲染的图像保存为临时文件,并在需要时从磁盘加载:

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;public class PdfToImageWithDiskCache {private static final int dpi = 300; // 高质量DPI设置private static final String cacheDir = "path/to/cache/";public static void main(String[] args) {// PDF文件路径String pdfFilePath = "path/to/your/large/pdf/vg_doc.pdf";// 输出图片文件夹路径String outputDir = "path/to/output/images/";try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {PDFRenderer pdfRenderer = new PDFRenderer(document);int totalPages = document.getNumberOfPages();for (int page = 0; page < totalPages; ++page) {BufferedImage image = renderPageWithDiskCache(pdfRenderer, page);// 保存图片String fileName = outputDir + "pdf_page_" + (page + 1) + ".png";ImageIO.write(image, "png", new File(fileName));System.out.println("Saved page " + (page + 1) + " as image.");}} catch (IOException e) {e.printStackTrace();}}/*** 使用磁盘缓存渲染PDF页面* @param pdfRenderer PDFRenderer实例* @param page 页码(从0开始)* @return 缓存或渲染后的BufferedImage*/private static BufferedImage renderPageWithDiskCache(PDFRenderer pdfRenderer, int page) throws IOException {// 磁盘缓存文件路径File cachedFile = new File(cacheDir + "page_" + page + ".png");// 如果缓存文件已存在,则从磁盘加载if (cachedFile.exists()) {System.out.println("Loading page " + (page + 1) + " from disk cache.");return ImageIO.read(cachedFile);}// 如果缓存文件不存在,则渲染并保存到磁盘System.out.println("Rendering page " + (page + 1) + "...");BufferedImage image = pdfRenderer.renderImageWithDPI(page, dpi);ImageIO.write(image, "png", cachedFile);return image;}
}

代码解释

  1. 缓存到磁盘: 通过 ImageIO.write() 将渲染的图像保存到磁盘上,如果该页面已经有缓存文件,则直接从磁盘读取。
  2. 缓存文件路径: 每个页面有对应的缓存文件名,避免重复渲染和保存。
  3. 适用于内存不足的情况: 当内存不足时,可以通过磁盘缓存减轻内存负担,同时仍然保留较好的访问速度。

通过这样的优化策略,咱们就可以在处理较大的 PDF 文件时,显著提升性能并减少资源消耗。

并行处理优化

接下来,看第二个问题:在处理很多页的 PDF 文件时,通过多线程并行处理每一页可以让处理速度显著提升,尤其是在每页渲染操作耗时较长的情况下。Java 提供了多线程的机制,咱们就用 ExecutorService 可以方便地管理和执行多线程任务。

下面来看一下如何实现哈,使用多线程并行处理 PDF 文件的每一页,将其转换为高质量图片。

主要步骤有三个

  1. 使用 ExecutorService 来创建线程池
  2. 每个线程独立处理一页 PDF,将其渲染为图片。
  3. 线程任务执行完毕后,统一关闭线程池

具体的代码实现

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.rendering.PDFRenderer;import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;public class PdfToImageWithMultithreading {// 设置DPI用于高质量渲染private static final int dpi = 300;public static void main(String[] args) {// PDF文件路径String pdfFilePath = "path/to/your/large/pdf/vg_doc.pdf";// 输出图片文件夹路径String outputDir = "path/to/output/images/";// 线程池大小(可以根据CPU核心数量或需要并行的任务数进行调整)int numThreads = Runtime.getRuntime().availableProcessors();ExecutorService executorService = Executors.newFixedThreadPool(numThreads);try (PDDocument document = PDDocument.load(new File(pdfFilePath))) {PDFRenderer pdfRenderer = new PDFRenderer(document);int totalPages = document.getNumberOfPages();System.out.println("Total pages: " + totalPages);// 为每一页创建一个并行处理任务for (int page = 0; page < totalPages; page++) {final int currentPage = page;  // 需要用final修饰以便在多线程中使用executorService.submit(() -> {try {renderAndSavePage(pdfRenderer, currentPage, outputDir);} catch (IOException e) {e.printStackTrace();}});}} catch (IOException e) {e.printStackTrace();} finally {// 关闭线程池executorService.shutdown();try {// 等待所有线程任务完成if (!executorService.awaitTermination(60, TimeUnit.MINUTES)) {System.err.println("Some tasks did not finish within the timeout.");}} catch (InterruptedException e) {e.printStackTrace();}}}/*** 渲染PDF页面并保存为图片* @param pdfRenderer PDFRenderer实例* @param page 页码(从0开始)* @param outputDir 输出目录* @throws IOException 如果发生IO错误*/private static void renderAndSavePage(PDFRenderer pdfRenderer, int page, String outputDir) throws IOException {// 渲染页面为高质量图片BufferedImage image = pdfRenderer.renderImageWithDPI(page, dpi);// 保存图片文件String fileName = outputDir + "pdf_page_" + (page + 1) + ".png";ImageIO.write(image, "png", new File(fileName));System.out.println("Saved page " + (page + 1) + " as image.");}
}

来详细解释一下代码和思路

1. 线程池的使用
  • ExecutorService :我们使用 Executors.newFixedThreadPool(numThreads) 来创建一个固定大小的线程池,其中 numThreads 是线程的数量。通过 Runtime.getRuntime().availableProcessors() 获取 CPU 核心数作为线程池大小的依据,通常这个值是处理器核心数。
  • submit() :将任务提交给线程池,submit() 方法会立即返回,不会阻塞主线程,从而能够让多个页面同时处理。
2. 任务分配
  • 每一页的渲染任务被分配到一个线程中,通过 executorService.submit() 提交渲染任务。每个任务都会调用 renderAndSavePage() 方法,处理特定页面的渲染和保存。
3. 渲染与保存
  • 每个线程使用 renderAndSavePage() 方法渲染指定页码的 PDF,并将生成的图像保存为 PNG 文件。这里使用 ImageIO.write() 来保存渲染结果。
  • 输出的文件名根据页面编号动态生成。
4. 关闭线程池
  • shutdown() :主线程在提交所有任务后调用 shutdown() 方法,通知线程池停止接收新的任务。
  • awaitTermination():主线程等待所有线程任务完成,这里设置了一个较长的超时时间(60分钟),你要根据实际情况来调整一下,确保所有页都能被处理完毕。

小结一下

通过多线程处理PDF的每一页,能显著缩短处理时间,特别是在处理大文件或大量页数的PDF时。线程池中的任务可以同时在多个CPU核心上运行,最大化利用硬件资源。对于超级大PDF文件或需要处理大量PDF时,可那就得上分布式处理了,每个节点处理一部分页面来解决,这里就不多赘述了。

最后

Java 如何实现PDF转高质量图片的案例就讲完了,喜欢这篇文件的话,一定帮我点赞、评论支持哦,如果怕忘了,收藏起来备孕是不错的选择。关注威哥爱编程,一群人的坚持才更加快乐。么么哒~~~

相关文章:

Java如何实现PDF转高质量图片

大家好&#xff0c;我是 V 哥。在Java中&#xff0c;将PDF文件转换为高质量的图片可以使用不同的库&#xff0c;其中最常用的库之一是 Apache PDFBox。通过该库&#xff0c;你可以读取PDF文件&#xff0c;并将每一页转换为图像文件。为了提高图像的质量&#xff0c;你可以指定分…...

itemStyle.normal.label is deprecated, use label instead.

itemStyle.normal.label is deprecated, use label instead. normal’hierarchy in label has been removed since 4.0. All style properties are configured in label directly now. 错误写法&#xff1a; itemStyle: {normal: {// color: #00E0FF, // 设置折线点颜色 labe…...

如何在 Linux VPS 上保护 MySQL 和 MariaDB 数据库

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 简介 有许多在 Linux 和类 Unix 系统上可用的 SQL 数据库语言实现。MySQL 和 MariaDB 是在服务器环境中部署关系型数据库的两个流行选项…...

CSS 样式 box-sizing: border-box; 用于控制元素的盒模型如何计算宽度和高度

文章目录 box-sizing: border-box; 的含义默认盒模型 (content-box)border-box 盒模型 在微信小程序中的应用示例 在微信小程序中&#xff0c;CSS 样式 box-sizing: border-box; 用于控制元素的盒模型如何计算宽度和高度。具体来说&#xff0c; box-sizing: border-box; 会改…...

预训练 BERT 使用 Hugging Face 和 PyTorch 在 AMD GPU 上

Pre-training BERT using Hugging Face & PyTorch on an AMD GPU — ROCm Blogs 2024年1月26日&#xff0c;作者&#xff1a;Vara Lakshmi Bayanagari. 这篇博客解释了如何从头开始使用 Hugging Face 库和 PyTorch 后端在 AMD GPU 上为英文语料(WikiText-103-raw-v1)预训练…...

鸿蒙是必经之路

少了大嘴的发布会&#xff0c;老实讲有点让人昏昏入睡。关于技术本身的东西&#xff0c;放在后面。 我想想来加把油~ 鸿蒙发布后褒贬不一&#xff0c;其中很多人不太看好鸿蒙&#xff0c;一方面是开源性、一方面是南向北向的利益问题。 不说技术的领先点&#xff0c;我只扯扯…...

Java项目实战II基于微信小程序的马拉松报名系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 马拉松运动…...

家用wifi的ip地址固定吗?换wifi就是换ip地址吗

在探讨家用WiFi的IP地址是否固定&#xff0c;以及换WiFi是否就意味着换IP地址这两个问题时&#xff0c;我们首先需要明确几个关键概念&#xff1a;IP地址、家用WiFi网络、以及它们之间的相互作用。 一、家用WiFi的IP地址固定性 家用WiFi环境中的IP地址通常涉及两类&#xff1a…...

codeforces _ 补题

C. Ball in Berland 传送门&#xff1a;Problem - C - Codeforces 题意&#xff1a; 思路&#xff1a;容斥原理 考虑 第 i 对情侣组合 &#xff0c;男生为 a &#xff0c;女生为 b &#xff0c;那么考虑与之匹配的情侣 必须没有 a | b &#xff0c;一共有 k 对情侣&#x…...

DataSophon集成ApacheImpala的过程

注意: 本次安装操作系统环境为Anolis8.9(Centos7和Centos8应该也一样) DataSophon版本为DDP-1.2.1 整合的安装包我放网盘了: 通过网盘分享的文件&#xff1a;impala-4.4.1.tar.gz等2个文件 链接: https://pan.baidu.com/s/18KfkO_BEFa5gVcc16I-Yew?pwdza4k 提取码: za4k 1…...

深入探讨TCP/IP协议基础

在当今数字化的时代&#xff0c;计算机网络已经成为人们生活和工作中不可或缺的一部分。而 TCP/IP 协议作为计算机网络的核心协议&#xff0c;更是支撑着全球互联网的运行。本文将深入探讨常见的 TCP/IP 协议基础&#xff0c;带你了解计算机网络的奥秘。 一、计算机网络概述 计…...

《Windows PE》7.4 资源表应用

本节我们将通过两个示例程序&#xff0c;演示对PE文件内图标资源的置换与提取。 本节必须掌握的知识点&#xff1a; 更改图标 提取图标资源 7.4.1 更改图标 让我们来做一个实验&#xff0c;替换PE文件中现有的图标。如果手工替换&#xff0c;一定是先找到资源表&#xff0c;…...

【重生之我要苦学C语言】猜数字游戏和关机程序的整合

今天来把学过的猜数字游戏和关机程序来整合一下 如果有不明白的可以看往期的博客 废话不多说&#xff0c;上代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <time.h> #include <stdlib.h> #include <string.h> void…...

基于centos7脚本一键部署gpmall商城

基于centos7脚本一键部署单节点gpmall商城&#xff0c;该商城可单节点&#xff0c;可集群&#xff0c;可高可用集群部署&#xff0c;VMware17&#xff0c;虚拟机IP&#xff1a;192.168.200.100 将软件包解压到/root目录 [rootlocalhost ~]# ls dist …...

Mac book英特尔系列?M系列?两者有什么区别呢

众所周知&#xff0c;Mac book有M系列&#xff0c;搭载的是苹果自研的M芯片&#xff0c;也有着英特尔系列&#xff0c;搭载的是英特尔的处理器&#xff0c;虽然从 2020 年开始&#xff0c;苹果公司逐步推出了自家研发的 M 系列芯片&#xff0c;并逐渐将 MacBook 产品线过渡到 M…...

Python unstructured库详解:partition_pdf函数完整参数深度解析

Python unstructured库详解&#xff1a;partition_pdf函数完整参数深度解析 1. 简介2. 基础文件处理参数2.1 文件输入参数2.2 页面处理参数 3. 文档解析策略3.1 strategy参数详解3.2 策略选择建议 4. 表格处理参数4.1 表格结构推断 5. 语言处理参数5.1 语言设置 6. 图像处理参数…...

<项目代码>YOLOv8路面病害识别<目标检测>

YOLOv8是一种单阶段&#xff08;one-stage&#xff09;检测算法&#xff0c;它将目标检测问题转化为一个回归问题&#xff0c;能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法&#xff08;如Faster R-CNN&#xff09;&#xff0c;YOLOv8具有更高的…...

广告牌和标签学习

效果&#xff1a; 知识学习&#xff1a; entities添加标签label和广告牌billboard label&#xff1a; text&#xff1a;文本添加 font&#xff1a;字体大小和字体类型 fillColor&#xff1a;字体颜色 outlineColor&#xff1a;字体外轮廓颜色 outlineWidth&#xff1a;字体外轮…...

GDB 从裸奔到穿戴整齐

无数次被问道&#xff1a;你在终端下怎么调试更高效&#xff1f;或者怎么在 Vim 里调试&#xff1f;好吧&#xff0c;今天统一回答下&#xff0c;我从来不在 vim 里调试&#xff0c;因为它还不成熟。那除了命令行 GDB 裸奔以外&#xff0c;终端下还有没有更高效的方法&#xff…...

WPF的触发器(Trigger)

WPF&#xff08;Windows Presentation Foundation&#xff09;是微软.NET框架的一部分&#xff0c;用于构建Windows客户端应用程序。在WPF中&#xff0c;触发器&#xff08;Triggers&#xff09;是一种强大的功能&#xff0c;允许开发者根据控件的状态或属性值来动态改变控件的…...

全能大模型GPT-4o体验和接入教程

GPT-4o体验和接入教程 前言一、原生API二、Python LangchainSpring AI总结 前言 Open AI发布了产品GPT-4o&#xff0c;o表示"omni"&#xff0c;全能的意思。 GPT-4o可以实时对音频、视觉和文本进行推理&#xff0c;响应时间平均为 320 毫秒&#xff0c;和人类之间对…...

详解Apache版本、新功能和技术前景

文章目录 一、 版本溯源二、新功能和特性举例1. 模块化和可扩展性增强2. 多处理模块&#xff08;MPMs&#xff09;3. 异步支持4. 更细粒度的日志级别控制5. 通用表达式解析器6. HTTP/2支持7. Server Push8. Early Hints9. 更好的SSL/TLS支持10. 更安全的默认设置 三、 技术前景…...

Docker Redis集群3主3从模式

主从集群 docker run -d --name redis-node1 --net host --privilegedtrue -v /home/redis/node1:/data redis:7.0 --cluster-enabled yes --appendonly yes --port 9371docker run -d --name redis-node2 --net host --privilegedtrue -v /home/redis/node2:/data redis:7.0 …...

【Go语言】

type关键字的用法 定义结构体定义接口定义类型别名类型定义类型判断 别名实际上是为了更好地理解代码/ 这里要分点进行记录 使用传值的例子&#xff0c;当两个类型不一样需要进行类型转换 type Myint int // 自定义类型&#xff0c;基于已有的类型自定义一个类型type Myin…...

【Spring Boot】元注解

元注解 1.元注解1.1 Target1.2 Retention1.3 Inherited1.4 Documented1.5 interface 2.自定义注解2.1 创建自定义注解类2.2 实现业务逻辑2.3 使用自定义注解 1.元注解 元注解就是定义注解的注解&#xff0c;是 Java 提供的用于定义注解的基本注解。 注解 说明 Retention是注解…...

基于信号分解和多种深度学习结合的上证指数预测模型

大家好&#xff0c;我是带我去滑雪&#xff01; 为了给投资者提供更准确的投资建议、帮助政府和监管部门更好地制定相关政策&#xff0c;维护市场稳定&#xff0c;本文对股民情绪和上证指数之间的关系进行更深入的研究&#xff0c;并结合信号分解、优化算法和深度学习对上证指数…...

基于Spring Boot的酒店住宿管理平台

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理酒店客房管理系统的相关信息成为必然。开发…...

游聚对战平台 三国战纪2012CE修改器修改地址

游聚对战平台 三国战纪2012比较全的一次地址。 工具 ce修改器 自行百度下载 1袖箭 2褐色鸡蛋 3毒堂 4飞盘 5火焰弹 6绿色鸡蛋 7金珠 8毒蝎 9毒镖 10铁莲花 11张陵剑 12张角巾 13太清丹经 14黄石公 15九节杖 16隐身衣 17神仙笔 18 玉蜂术&#xff08;效果不明&#xff09;19天师…...

Qt Creator中的项目栏

shadow build: [基础]Qt Creator 的 Shadow build(影子构建)-CSDN博客 影子构建&#xff1a;将源码路径和构建路径分开&#xff08;生成的makefile文件和其他产物都不放到源码路径&#xff09;&#xff0c;以此来保证源码路径的清洁。 实验1&#xff1a; 我创建了两个项目:…...

keepalived+web 实现双机热备

环境&#xff1a;利用keeplived实现web服务器的双机热备(高可用) 注意&#xff1a; (1) 利用keeplivedweb做双击热备&#xff08;高可用&#xff09;&#xff0c;最少需要两台服务器&#xff0c;可以实现多域名对应一个VIP,并且访问不同域名&#xff0c;显示不同主页&#xf…...

网页游戏开服表今日/东莞seo排名优化

1. 习题问题的总结(1) 不要讲问题复杂化, 越简单越好(2) 自己要测试。多测试&#xff0c;测试要完整(类型测试和内容测试)# -*- codingutf-8 -*- # 习题&#xff1a;# 1.定义一个方法 func&#xff0c;该func可以引入任意多的整型参数&#xff0c;结果返回其中最大与最小的值。…...

如何设计网络/邵阳seo优化

DNS服务配置及拓展一.DNS服务的信息说明:A ##正向记录PTR ##反向,ip到域名host -l example.com ##查看域中的所有主机dig -t soa example.com ##辅助dns软件包: bind DNS主配置目录:/var/named/chroot/DNS主配置文件:/etc/nam…...

自己建立网站怎么搞/销售网络平台

第一步先查看是不是端口号被占用 netstat -aon|findstr "3306"33060是mysql8.0版本的扩展端口 果然被占用。 强制终止进程 强制终止进程 11536 taskkill /F /pid 11536...

专做蓝领的网站/免费建立一个网站

1、JS 命名规范 命名规范是很有必要的&#xff0c;可增强代码的可读性&#xff0c;一眼就能看懂要表达的意思&#xff0c;规范就是符合规则&#xff0c;使代码有利于后期维护&#xff0c;也能很大程度的提高开发效率。一个正常的网站有很多 JS 代码&#xff0c;如果在编写的过程…...

workerman 做网站/百度快照是怎么做上去的

现在Rust中文社区形成了Rust中文文档中心和在线中文论坛&#xff0c;相辅相成致力于Rust语言中文网络&#xff01; 访问论坛是直接访问 https://rustlang-cn.org 通过导航栏论坛访问,所以不需要在多记住一个地址&#xff01;同时论坛的文档即为跳转到主站所以文档中心与中文论坛…...

怎么用dreamweaver做网站/uc推广登录入口

ubuntu的网络配置文件在 /etc/network/intrfaces; suse的网络配置在 /etc/sysconfig/network/下面&#xff0c;每个网卡一个配置文件。 intrfaces如下内容表示使用DHCP分配IP&#xff1a;auto loiface lo inet loopback auto eth0iface eth0 inet dhcp Dynamic Host C…...