Python3 处理PDF之PyMuPDF 入门

PyMuPDF 简介

PyMuPDF是一个用于处理PDF文件的Python库,它提供了丰富的功能来操作、分析和转换PDF文档。这个库的设计目标是提供一个简单易用的API,使得开发者能够轻松地在Python程序中实现PDF文件的各种操作。

PyMuPDF的主要特点如下:

  • 跨平台兼容性:PyMuPDF支持多种操作系统,如Windows、macOS和Linux,可以在这些平台上运行Python程序。
  • 强大的PDF处理能力:PyMuPDF提供了丰富的功能来操作PDF文件,如读取、写入、分割、合并、旋转、裁剪等。此外,它还支持加密和解密PDF文档,以及提取文本、图像和元数据等信息。
  • 易于使用:PyMuPDF的API设计简洁明了,易于学习和使用。开发者可以通过简单的函数调用来实现各种PDF操作,而无需深入了解底层细节。

PyMuPDF 安装及其依赖第三方框架

pip 安装 PyMuPDF 模块

pip install pymupdf

验证pymupdf 模块是否安装成功

import fitz
import PIL# 打印pymupdf模块:基本信息
from fitz import TextPageprint(fitz.__doc__)

PyMuPDF 1.22.5: Python bindings for the MuPDF 1.22.2 library.
Version date: 2023-06-21 00:00:01.
Built for Python 3.10 on win32 (64-bit).

PyMuPDF 依赖第三方框架 

当使用Pixmap.pil_save()Pixmap.pil_tobytes() 需要 Pillow模块

当使用Document.subset_fonts()时需要  FontTools模块

PyMuPDF 核心类

在PyMuPDF 核心类演示涉及类

 其他未使用到的其他类:Archive(档案)、Colorspace(色彩空间对象)、DisplayList(显示列表对象)、DocumentWriter(文档编辑对象)、Identity(身份对象)、 IRect(长方形对象)、linkDest(连接目的对象)、Matrix(矩阵对象)、Outline(大纲)、Quad(四边形对象)、Shape(形状对象)、 Story(章节对象)、TextPage(文本页面对象)、TextWriter(文本写入对象)、Tools(工具类)、Xml(xml 文档对象)

PyMuPDF 核心类演示

加载PDF文件

# 加载pdf 文件
doc = fitz.open("E:\doc\opencv 4.1中文官方文档v1.1版.pdf")

获取Document 属性和方法

# 获取Document 文档对象的属性和方法
# 1、获取pdf 页数
pageCount = doc.page_count
print("pdf 页数", pageCount)# 2、获取pdf 元数据
metaData = doc.metadata
print("pdf 元数据:", metaData)# 3、获取pdf 目录信息
toc = doc.get_toc()
print("pdf 目录:", toc)

Page 属性和方法

通过Page 对象实现以下功能:

• 您可以将页面呈现为光栅或矢量(SVG)图像,可以选择缩放、旋转、移动或剪切页面。

• 您可以提取多种格式的页面文本和图像,并搜索文本字符串。

Page 加载方法

page = doc.load_page(pno) # loads page number 'pno' of the document (0-based)
page = doc[pno] # the short form

Documnet 迭代器加载Page 方法

for page in doc:# do something with 'page'# ... or read backwards
for page in reversed(doc):# do something with 'page'# ... or even use 'slicing'
for page in doc.pages(start, stop, step):# do something with 'page'
# 获取Page 页面对象的属性和方法
page = doc.load_page(1)  # 默认加载第一页
print("page 对象:", page)

检查页面的链接、批注或表单字段

# 1、获取Page 页面的链接、批注或表单字段
links = page.get_links()
for link in links:# 涉及Link 对象print("链接:", link)annots = page.annots()
for annot in annots:# 涉及Annot 对象print("批注:", annot)widgets = page.widgets()
for widget in widgets:# 涉及表单字段print("表单字段:", widget)

页面展示/页面图像保存到文件中

# 2、Page 页面-光栅图像
pix = page.get_pixmap()
print("打印页面图像对象:", pix)
# 保存光栅图像图像,需要依赖第三方框架:Pillow
pix.pil_save("page-%i.png" % page.number)

Page.get_pixmap()提供了许多用于控制图像的变体:分辨率、颜色空间(例如,生成灰度图像或具有减色方案的图像)、透明度、旋转、镜像、移位、剪切等。

Pixmap包含以下引用的许多方法和属性。其中包括整数宽度高度(每个像素)和跨距(一个水平图像行的字节数)。属性示例表示表示图像数据的矩形字节区域(Python字节对象)。

温馨提示:page.get_svg_image()创建页面的矢量图像。 

提取文本和图像

# 3、Page 获取文本\图像\其他信息
# 温馨提示:涉及TextPage 常量类型定义
text = page.get_text("text")
print("指定页面文本内容:", text)

opt使用以下字符串之一以获取不同的格式:

  • "text":(默认)带换行符的纯文本。无格式、无文字位置详细信息、无图像- "blocks":生成文本块(段落)的列表- "words":生成单词列表(不包含空格的字符串)- "html":创建页面的完整视觉版本,包括任何图像。这可以通过internet浏览器显示- "dict"/"json":与HTML相同的信息级别,但作为Python字典或resp.JSON字符串。- "rawdict"/"rawjson""dict"/"json"的超级集合。它还提供诸如XML之类的字符详细信息。- "xhtml":文本信息级别与文本版本相同,但包含图像。- "xml":不包含图像,但包含每个文本字符的完整位置和字体信息。使用XML模块进行解释。

搜索文本

# 4、Page 文本检索
search = page.search_for("图像的基本操作")
print("打印检索文本的位置:", search)

提供一个矩形列表,每个矩形都包含一个字符串“mupdf”(不区分大小写)。

PDF操作 

PDF是唯一可以使用PyMuPDF修改的文档类型。其他文件类型是只读的。但是,您可以将任何文档(包括图像)转换为PDF,然后将所有PyMuPDF功能应用于转换果,Document.convert_to_pdf()

Document.save()始终将PDF以其当前(可能已修改)状态存储在磁盘上。

通常,您可以选择是保存到新文件,还是仅将修改附加到现有文件(“增量保存”),这通常要快得多。

# Document 操作PDF页面
# 1、PDF 页面删除
# doc.delete_page(1)
# 1、PDF 页面拷贝和移动
doc.copy_page(1)  # 第一页移动最后一页,温馨提示:移动的页面还在元PDF 文件中。
# 1、 PDF 插入页面,  返回插入页面对象
new_page = doc.new_page(pno=-1, width=595, height=842)
# 插入页面, 设置文本
text = "你的文本"
point = fitz.Point(50, 50)  # 这是一个下x,y 二维坐标系,在这个区域内插入你的文本
new_page.insert_text(point, text, fontsize=20)
# 2、Document 保存
doc.save("opencv pdf文件调整.pdf")
# 3、Documemt 销毁
doc.close()

PDF 删除方法

Document.delete_page()
Document.delete_pages()

PDF移动拷贝方法

Document.copy_page()
Document.fullcopy_page()
Document.move_page()

PDF插入Page 方法

Document.insert_page()
Document.new_page()

PyMuPDF 核心功能模块封装

PDF 分割

每一页单独保存为一个pdf

def split_per_page(input, output):if not os.path.exists(output):os.makedirs(output)doc = fitz.open(input)for page in range(doc.page_count):dst_doc = fitz.open()dst_doc.insert_pdf(doc,from_page=page,to_page=page)dst_doc.save(os.path.join(output,f'{page}.pdf'))dst_doc.close()doc.close()# 把每一个页面保存为一个pdf,并保存在test文件夹中
split_per_page("test.pdf","test")

范围内的页面保存为pdf 

def split_range_page(input, output, range):if not os.path.exists(output):os.makedirs(output)doc = fitz.open(input)start = range[0] - 1end = range[1] - 1dst_doc = fitz.open()dst_doc.insert_pdf(doc, from_page=start, to_page=end)dst_doc.save(os.path.join(output,'range_page.pdf'))dst_doc.close()doc.close()# 把1-10也保存为pdf,保存在test文件夹中
split_range_page('test.pdf','test', [1,10])

 任意的页面保存为pdf

def split_selected_page(input, output, pages):if not os.path.exists(output):os.makedirs(output)doc = fitz.open(input)result = map(lambda x: x - 1, pages)doc.select(list(result))doc.save(os.path.join(output,'selected_pages.pdf'))doc.close()# 把第一、三、八页面保存为pdf,并保存在test文件夹中
split_selected_page('test.pdf','test',[1,3, 8])

PDF 合并

import fitzdoc_a = fitz.open("a.pdf") # open the 1st document
doc_b = fitz.open("b.pdf") # open the 2nd documentdoc_a.insert_pdf(doc_b) # merge the docs
doc_a.save("a+b.pdf") # save the merged document with a new filename# 把b.pdf合并到a.pdf,保存为a+b.pdf

PDF 中的图片提取

import fitzdoc = fitz.open("test.pdf") # open a documentfor page_index in range(len(doc)): # iterate over pdf pagespage = doc[page_index] # get the pageimage_list = page.get_images()# print the number of images found on the pageif image_list:print(f"Found {len(image_list)} images on page {page_index}")else:print("No images found on page", page_index)for image_index, img in enumerate(image_list, start=1): # enumerate the image listxref = img[0] # get the XREF of the imagepix = fitz.Pixmap(doc, xref) # create a Pixmapif pix.n - pix.alpha > 3: # CMYK: convert to RGB firstpix = fitz.Pixmap(fitz.csRGB, pix)pix.save("page_%s-image_%s.png" % (page_index, image_index)) # save the image as pngpix = None

PDF 保存为图片

def covert2pic(zoom):doc = fitz.open("test.pdf")total = doc.page_countfor pg in range(total):page = doc[pg]zoom = int(zoom)            #值越大,分辨率越高,文件越清晰rotate = int(0)trans = fitz.Matrix(zoom / 100.0, zoom / 100.0).prerotate(rotate)pm = page.get_pixmap(matrix=trans, alpha=False)lurl='.pdf/%s.jpg' % str(pg+1)pm.save(lurl)doc.close()covert2pic(200)

PDF 添加水印

def add_watermark(input, watermark):doc = fitz.open(input)for page in doc:page.insert_image(page.bound(),filename=watermark, overlay=False)doc.save(os.path.join("test","watermark.pdf"))doc.close()add_watermark("test.pdf","watermark.png")

PDF 加密

PDF加密有两种形式

  • 用户加密,需要输入密码才能打开pdf
  • 拥有者加密,可以防止打印、复制、添加注释、添加删除页面等功能
def encrypt_pdf():perm = int(fitz.PDF_PERM_ACCESSIBILITY # always use this| fitz.PDF_PERM_PRINT # permit printing| fitz.PDF_PERM_COPY # permit copying| fitz.PDF_PERM_ANNOTATE # permit annotations) # 可以打印,复制,添加注释owner_pass = "owner" # owner passworduser_pass = "user" # user passwordencrypt_meth = fitz.PDF_ENCRYPT_AES_256 # strongest algorithmdoc = fitz.open("test.pdf") # empty pdfdoc.save("encrypt.pdf",encryption=encrypt_meth,owner_pw=owner_pass,permissions=perm,user_pw=user_pass) # 同时使用# 这两个加密方式可以,单独使用,也可以同时使用# 单独使用用户加密
doc.save("encrypt.pdf",encryption=encrypt_meth,owner_pw=owner_pass)

PyMuPDF 在PyQT5 运用

功能要求:在PyQT-5 展示pdf 文件.

效果展示:

PyQT-5 UI效果展示和源文件

 

 pdfshow.ui

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0"><class>Form</class><widget class="QWidget" name="Form"><property name="geometry"><rect><x>0</x><y>0</y><width>400</width><height>300</height></rect></property><property name="windowTitle"><string>Form</string></property><widget class="QLabel" name="label"><property name="geometry"><rect><x>130</x><y>70</y><width>54</width><height>12</height></rect></property><property name="text"><string>PDF展示</string></property></widget></widget><resources/><connections/>
</ui>

pdfshow.py 源码

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'pdfshow.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.
import sysfrom PyQt5 import QtCore, QtWidgets
from PyQt5.QtGui import QImage, QPixmap, QTransform
from PyQt5.QtWidgets import QWidget, QApplication
# 添加PDF 文件操作依赖
import fitzclass Ui_Form(QWidget):def __init__(self):super().__init__()self.label = Noneself.setupUi()self.image()def setupUi(self):self.setObjectName("Form")self.resize(400, 300)self.label = QtWidgets.QLabel(self)self.label.setGeometry(QtCore.QRect(130, 70, 54, 12))self.label.setObjectName("label")self.retranslateUi()QtCore.QMetaObject.connectSlotsByName(self)def retranslateUi(self):_translate = QtCore.QCoreApplication.translateself.setWindowTitle(_translate("Form", "Form"))self.label.setText(_translate("Form", "PDF展示"))def image(self):file = "E:\doc\opencv 4.1中文官方文档v1.1版.pdf"# 打开文件doc = fitz.open(file)# 读取一页 0代表第1页page_one = doc.load_page(1)# 将第一页转换为Pixmappage_pixmap = page_one.get_pixmap()# 将Pixmap转换为QImageimage_format = QImage.Format_RGBA8888 if page_pixmap.alpha else QImage.Format_RGB888page_image = QImage(page_pixmap.samples, page_pixmap.width,page_pixmap.height, page_pixmap.stride, image_format)width = page_image.width()height = page_image.height()# QImage 转为QPixmappix = QPixmap.fromImage(page_image)trans = QTransform()trans.rotate(90)  # 这里设置旋转角度new = pix.transformed(trans)# 设置标签宽和高self.label.setFixedSize(400, 350)# 设置图片大小自适应标签self.label.setScaledContents(True)# 给标签设置图像self.label.setPixmap(new)if __name__ == '__main__':app = QApplication(sys.argv)w = Ui_Form()w.show()sys.exit(app.exec_())

解决思路

  1. 使用PyMuPDF模块打开文件。
  2. 读取第一页pdf文件第一页。
  3. 从第一页获取图像,是Pixmap类。
  4. 使用PyQt5的QImage将上面的Pixmap转换为QImage。
  5. 将QImage转换为QPixmap。
  6. 将QPixmap设置给Label。

 PyMuPDF 预览PDF  文件

UI 原型设计:

 Python 源码

ImageListWidget:自定义QListWidget 列表组件,仅仅展示图片模式

# _*_ coding : UTF-8_*_
# 开发者 : zhuozhiwengang
# 开发时间 : 2023/8/6 0:54
# 文件名称 : ImageListWidget
# 开发工具 : PyCharm
import osfrom PyQt5.QtCore import QSize
from PyQt5.QtGui import QIcon
from PyQt5.QtWidgets import QListWidget, QListWidgetItem, QListView, QWidget, QApplication, QHBoxLayout, QLabel, \QVBoxLayoutclass ImageListWidget(QListWidget):def __init__(self):super(ImageListWidget, self).__init__()self.setFlow(QListView.Flow(1))#0: left to right,1: top to bottomself.setIconSize(QSize(150, 100))# 设置控件的列表视图模式为IconModeself.setViewMode(QListWidget.IconMode)# 设置垂直布局self.setLayout(QVBoxLayout())def add_image_items(self, image_paths=[]):for i in range(len(image_paths)):# 创建缩略图图标icon = QIcon()icon.addPixmap(image_paths[i], QIcon.Normal, QIcon.Off)# 创建QListWidgetItem对象,并设置图标和它的描述文字item = QListWidgetItem(icon, str(i))# 把item添加到listWidget中self.addItem(item)

ImageViewerWidget:自定义PDF预览组件 

# _*_ coding : UTF-8_*_
# 开发者 : zhuozhiwengang
# 开发时间 : 2023/8/6 0:55
# 文件名称 : ImageViewerWidget
# 开发工具 : PyCharm
import fitz
from PyQt5.QtGui import QPixmap, QImage
from PyQt5.QtWidgets import QWidget, QLabel, QHBoxLayout, QApplication, QVBoxLayoutfrom ImageListWidget import ImageListWidgetclass ImageViewerWidget(QWidget):def __init__(self):super(QWidget, self).__init__()# 显示控件self.list_widget = ImageListWidget()self.list_widget.setMinimumWidth(200)self.show_label = QLabel(self)self.show_label.setFixedSize(600, 400)self.image_paths = []self.currentImgIdx = 0self.currentImg = None# 水平布局self.layout = QVBoxLayout(self)self.layout.addWidget(self.show_label)self.layout.addWidget(self.list_widget)# 信号与连接self.list_widget.itemSelectionChanged.connect(self.loadImage)def load_from_paths(self, img_paths=[]):self.image_paths = img_pathsself.list_widget.add_image_items(img_paths)def loadImage(self):self.currentImgIdx = self.list_widget.currentIndex().row()if self.currentImgIdx in range(len(self.image_paths)):self.currentImg = QPixmap(self.image_paths[self.currentImgIdx]).scaledToHeight(400)self.show_label.setPixmap(self.currentImg)if __name__ == "__main__":import sysapp = QApplication(sys.argv)# 图像路径file = "E:\doc\opencv 4.1中文官方文档v1.1版.pdf"# 打开文件doc = fitz.open(file)img_paths = []for i in range(0, doc.page_count):# 读取一页 0代表第1页page = doc.load_page(i)# 将第一页转换为Pixmappage_pixmap = page.get_pixmap()# 将Pixmap转换为QImageimage_format = QImage.Format_RGBA8888 if page_pixmap.alpha else QImage.Format_RGB888page_image = QImage(page_pixmap.samples, page_pixmap.width,page_pixmap.height, page_pixmap.stride, image_format)width = page_image.width()height = page_image.height()# QImage 转为QPixmappix = QPixmap.fromImage(page_image)img_paths.append(pix)# 显示控件main_widget = ImageViewerWidget()main_widget.load_from_paths(img_paths)main_widget.setWindowTitle("ImageViewer")main_widget.show()# 应用程序运行sys.exit(app.exec_())

Python 效果展示

 

PDF 预览组件基本实现,但是没有进行细化,此代码仅供参考。

 

 

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

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

相关文章

Spring Data JPA源码

导读: 什么是Spring Data JPA? 要解释这个问题,我们先将Spring Data JPA拆成两个部分&#xff0c;即Sping Data和JPA。 从这两个部分来解释。 Spring Data是什么? 摘自: https://spring.io/projects/spring-data Spring Data’s mission is to provide a familiar and cons…

1、Spark SQL 概述

1、Spark SQL 概述 Spark SQL概念 Spark SQL is Apache Spark’s module for working with structured data. 它是spark中用于处理结构化数据的一个模块 Spark SQL历史 Hive是目前大数据领域&#xff0c;事实上的数据仓库标准。 Shark&#xff1a;shark底层使用spark的基于…

NOsql之MongoDB入门分享

目录 一、MongoDB简介 1、概念理解 2、yum安装部署 3、二进制安装部署 4、配置文件解析 二、MongoDB基本管理 1、登录操作 2、管理命令 3、用户管理 一、MongoDB简介 1、概念理解 关系型数据库&#xff08;RDBMS:Relational Database Management System) MySql、Ora…

oop基础--成员方法传参机制(重要)

文章目录 1. 基本数据类型的传参机制2. 引用数据类型的传参机制 1. 基本数据类型的传参机制 先让我们猜一下如下代码的输出结果~ public class MethodParameter01 {//编写一个 main 方法public static void main(String[] args) {int a 10;int b 20;//创建 A 对象 名字 obj…

计算机毕设 深度学习疫情社交安全距离检测算法 - python opencv cnn

文章目录 0 前言1 课题背景2 实现效果3 相关技术3.1 YOLOV43.2 基于 DeepSort 算法的行人跟踪 4 最后 0 前言 &#x1f525; 这两年开始毕业设计和毕业答辩的要求和难度不断提升&#xff0c;传统的毕设题目缺少创新和亮点&#xff0c;往往达不到毕业答辩的要求&#xff0c;这两…

oracle数据库创建用户并插入数据

Oracle第一话 数据库权限设置 序言 ​ 具体的错误类型&#xff0c;我看大概是这样的 一 Oracle比mysql复杂一点 首先&#xff0c;创建一个表空间 -- 创建名为"TEST_DATA"表空间 CREATE TABLESPACE TEST_DATA NOLOGGING -- 数据存放的位置 DATAFILE D:\test_data…

Qt项目---简单的计算器

在这篇技术博客中&#xff0c;我们将介绍如何使用Qt框架实现一个简单的计算器应用。我们将使用C编程语言和Qt的图形用户界面库来开发这个应用&#xff0c;并展示如何实现基本的算术操作。 项目设置 首先&#xff0c;我们需要在Qt Creator中创建一个新的Qt Widgets应用程序项目…

【二进制安全】堆漏洞:Double Free原理

参考&#xff1a;https://www.anquanke.com/post/id/241598 次要参考&#xff1a;https://xz.aliyun.com/t/6342 malloc_chunk 的源码如下&#xff1a; struct malloc_chunk { INTERNAL_SIZE_T prev_size; /*前一个chunk的大小*/ INTERNAL_SIZE_T size; /*当前chunk的…

TPlink DDNS 内网穿透?外网访问设置方法

有很多小伙伴都想知道&#xff1a;TPlink路由器怎么设置DDNS内网穿透&#xff1f;今天&#xff0c;小编就给大家分享一下TPlink DDNS 外网访问设置方法&#xff0c;下面是图文教程&#xff0c;帮助新手快速入门DDNS设置。 本文介绍的是云路由器TP-LINK DDNS的设置方法。TP-LIN…

Keil软件添加STC数据包方法

添加数据包方法如下&#xff1a; &#xff08;1&#xff09;首先&#xff0c;打开STC-ISP烧录工具&#xff1b; &#xff08;2&#xff09;点击“Keil仿真设置”&#xff0c;然后点击“添加型号和头文件到Keil中&#xff0c;添加STC仿真器驱动到Keil中”。 &#xff08;3&…

60多行代码仿制B站首页一个好看的卡片效果

文章目录 1、为啥是这个&#xff1f;2、仿制效果3、实现思路4、代码5、查看B站如何实现 1、为啥是这个&#xff1f; 看到Bilibili首页的一个卡片&#xff0c;看着效果很不错&#xff0c;给人很舒适的感觉。一琢磨貌似也不难&#xff0c;甚至只需要一层 div 就可以实现主要框架…

MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容测评

今天给大家带来了 MacBook Pro 16 M1 Max 升级 macOS Ventura 13.5 兼容 100 挑战赛 的视频&#xff0c;现在充电头再以文章的形式呈现给大家&#xff0c;让大家更清楚、直白的了解这款笔记本在升级系统后的兼容性如何。 MacBook Pro 16 M1 Max 配置了 140W 的 MagSafe 充电口&…

mybatisJava对象、list和json转换

1. 参考mybatis-plus mybatis Java对象、list和json转换 网上好多不靠谱&#xff0c;参考mybatis-plus中TableField&#xff0c;mybatis中自定义实现 这样不需要对象中属性字符串接收&#xff0c;保存到表中&#xff0c;都是转义字符&#xff0c;使用时还要手动转换为对象或者…

【Opencv入门到项目实战】(四):图像梯度计算|Sobel算子|Scharr算子|Laplacian算子

文章目录 0.引言1. Sobel算子2. Scharr算子3. Laplacian算子 0.引言 在图像处理中&#xff0c;梯度是指图像中像素灰度变化的速率或幅度&#xff0c;我们先来看下面这张图 假设我们想要计算出A点的梯度&#xff0c;我们可以发现A点位于边缘点&#xff0c;A点左边为黑色&#x…

骨传导耳机真不伤耳吗?骨传导耳机有什么好处?

骨传导耳机真不伤耳吗&#xff1f;骨传导耳机有什么好处&#xff1f; 我先来说说骨传导耳机的工作原理吧&#xff0c;骨传导是一种传声方式&#xff0c;声波通过颅骨、颌骨等头部骨头的振动&#xff0c;将声音传到内耳。其实骨传导的现象我们很常见&#xff0c;就像我们平时嗑瓜…

Qt5.13引入QtWebApp的模块后报错: error C2440: “reinterpret_cast”: 无法从“int”转换为“quintptr”

1、开发环境 Win10-64 qt5.13 msvc2015-64bit-release 2、报错 新建一个demo工程。 引入QtWebApp的httpserver、logging、templateengine三个模块后。 直接运行&#xff0c;&#xff0c;此时报错如下&#xff1a; E:\Qt5.13.1\install\5.13.1\msvc2015_64\include\QtCore…

测试工程师的工作

目录 1.何为软件测试工程师&#xff1f; 2.软件测试工程师的职责&#xff1f; 3.为什么要做软件测试&#xff1f; 4.软件测试的前途如何&#xff1f; 5.工具和思维谁更重要&#xff1f; 6.测试和开发相差大吗&#xff1f; 7.成为测试工程师的必备条件 8.测试的分类有哪…

【chrome扩展开发】vue-i18n使用问题及解决方案

记录chrome扩展开发时调用vue-i18n的一些问题和解决方法 环境 vue: ^3.3.4vue-i18n: ^9.2.2vite: ^4.4.8 错误1 Uncaught (in promise) EvalError: Refused to evaluate a string as JavaScript because unsafe-eval is not an allowed source of script in the following Con…

阿里云平台注册及基础使用

首先进入阿里云官网&#xff1a; 阿里云-计算&#xff0c;为了无法计算的价值 点击右上角“登录/注册”&#xff0c;如果没有阿里云账号则需要注册。 注册界面&#xff1a; 注册完成后需要开通物联网平台公共实例&#xff1a; 注册成功后的登录&#xff1a; 同样点击右上角的…

python与深度学习(十四):CNN和IKUN模型二

目录 1. 说明2. IKUN模型的CNN模型测试2.1 导入相关库2.2 加载模型2.3 设置保存图片的路径2.4 加载图片2.5 图片预处理2.6 对图片进行预测2.7 显示图片 3. 完整代码和显示结果4. 多张图片进行测试的完整代码以及结果 1. 说明 本篇文章是对上篇文章IKUN模型训练的模型进行测试。…