像WPS Office 一样处理pdf页面尺寸

1. 修改页面尺寸

import os
import shutil
import fitz  # PyMuPDFdef cm_to_px(cm):# 厘米转换成像素"""doc = fitz.open(input_file)page0 = doc[0]width_px = page0.mediabox.widthheight = page0.mediabox.heightprint(f'width_px:{width_px} height:{height}')"""import math# DPI 计算, 也可以通过计算得到# width_cm = 10  # cm     # wps office 页面属性显示的尺寸# width_px = 284.0  # px  # 程序读取的页面像素尺寸# DPI = int((width_px * 2.54) / width_cm) # 每英寸的像素数# print('DPI:', DPI)DPI = 72 # 72 DPI:通常用于网页图像,适合显示器上的低分辨率图像calculated_height_px = math.ceil((cm * DPI) / 2.54)print('calculated_height_px:', calculated_height_px)# print(cm * 72 / 2.54)return calculated_height_pxdef resize_pdf_pages(input_file, output_file, target_width=15, target_height=20):""":param input_file::param output_file::param target_width: 单位为厘米:param target_height: 单位为厘米"""# 将厘米转成像素target_width = cm_to_px(target_width)target_height = cm_to_px(target_height)doc = fitz.open(input_file)page0 = doc[0]width = page0.mediabox.widthheight = page0.mediabox.heightprint(f'width:{width} height:{height}')new_doc = fitz.open()  # 创建新文档for page in doc:# 创建新页面(指定目标尺寸)new_page = new_doc.new_page(width=target_width, height=target_height)# 计算源页面到目标页面的转换矩阵matrix = fitz.Matrix(target_width / page.rect.width,target_height / page.rect.height)print('matrix0:', matrix)width = page.mediabox.widthheight = page.mediabox.heightprint(f'width:{width} height:{height}')print(f'width:{width * 25.4 / 72} height:{height * 25.4 / 72}')print(page.mediabox)new_page.show_pdf_page(new_page.rect,  # 目标区域(使用整个新页面)doc,  # 源文档page.number  # 页码)new_doc.save(output_file)doc.close()new_doc.close()print(doc.is_closed)try:os.chmod(input_file, 0o777)os.remove(input_file)os.rename(output_file, input_file)return input_fileexcept Exception as e:print(e)return output_fileif __name__ == "__main__":# 修改pdf页面尺寸大小,例如将pdf页面尺寸修改成15cm*20cminput_pdf = r"C:\Users\EDY\Desktop\xxxxx\xxxx.pdf"output_pdf = input_pdf.replace('.pdf', '_1.pdf')resize_pdf_pages(input_pdf, output_pdf, 15, 20)

2. 将两个pdf拼接在一起


def merge_pages_vertically(page1, page2):"""将两个页面垂直合并(上下排列)Args:page1: 源页面1 (fitz.Page对象)page2: 源页面2 (fitz.Page对象)Returns:fitz.Document: 包含合并后页面的新文档"""# 1. 创建新文档new_doc = fitz.open()# 2. 计算新页面尺寸w1, h1 = page1.rect.width, page1.rect.heightw2, h2 = page2.rect.width, page2.rect.heightnew_width = max(w1, w2)new_height = h1 + h2# 3. 创建新页面new_page = new_doc.new_page(width=new_width, height=new_height)# 4. 定义目标区域rect_top = fitz.Rect(0, 0, new_width, h1)  # 顶部区域rect_bottom = fitz.Rect(0, h1, new_width, new_height)  # 底部区域# 5. 将源页面绘制到新页面(保留原始尺寸)new_page.show_pdf_page(rect_top, page1.parent, page1.number)new_page.show_pdf_page(rect_bottom, page2.parent, page2.number)return new_docdef merge_pdf(pdf1, pdf2, save_pdf):# 合并pdfdoc1 = fitz.open(pdf1)doc2 = fitz.open(pdf2)# 获取要合并的页面(此处选择第一页)page1 = doc1[0]page2 = doc2[0]# 垂直合并merged_doc = merge_pages_vertically(page1, page2)# 保存结果merged_doc.save(save_pdf)# 关闭文档doc1.close()doc2.close()merged_doc.close()if __name__ == "__main__":input_pdf = r"C:\Users\EDY\Desktop\xxxxx\xxxx.pdf"# 上下合并两个pdfsave_pdf = input_pdf.replace('.pdf', '_2.pdf')merge_pdf(input_pdf, input_pdf, save_pdf)

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

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

相关文章

Linux 基础开发工具

在 Linux 环境下进行开发,熟练掌握基础工具是提升效率、解决问题的核心前提。无论是软件安装、代码编辑,还是编译调试、版本管理,一套 “趁手” 的工具链能让开发过程事半功倍。本文将从 Linux 开发最核心的七大工具模块入手,一步…

TapData vs Kafka ETL Pipeline:竞争?共存?——企业实时数据策略的正确打开方式

【引言】企业实时数据流转,迎来“集成计算”新范式 企业 IT 架构的演进,从最初的数据孤岛,到集中式数据仓库,再到如今的实时数据驱动架构。在这一过程中,数据的集成(数据源→目标)与数据的计算&…

十九、云原生分布式存储 CubeFS

十九、云原生分布式存储 CubeFS 文章目录十九、云原生分布式存储 CubeFS1、分布式存储初识1.1 分布式存储主要特性1.2 为什么要在K8s上落地存储平台1.3 云原生存储平台CubeFS介绍1.4 分布式存储平台落地架构1.4.1 混合部署1.4.2 独立部署-基础设施集群1.5 资源分配建议1.6 硬件…

如何拯救一家濒临破产的科技公司?

从谷底爬起:Medium 的生死重生之路 2022年的 Medium,正坠入一个深不见底的深渊。 每月亏损260万美元,订阅用户持续流失——这不是增长,而是在消耗资本。更致命的是内容质量:平台充斥着“快速致富学”等空洞内容&#x…

数据结构-算法(一)

一、已知无向图的邻接矩阵,求无向图的邻接表。 (1)提示:无向图如下图(a)所示,已知邻接矩阵如图(b)所示,求对应的邻接表(c)。(2)请定义void adjMatrix_2_adjList(int b[4][4], AdjLis…

2025年嵌入式通信电源系统品牌有哪些?

现在科技跑得飞快,嵌入式通信电源系统可是越来越吃香了,尤其是在5G、物联网、智能家居这些热门地方。这玩意儿不光能让设备稳稳当当干活儿,还特省电、贼聪明,优势杠杠的!既然大家伙儿都这么需要它,那到了20…

Ubuntu24.04环境下causal_conv1d和mamba_ssm安装

环境:WSL的Ubuntu24.041.创建conda环境,其中python版本为3.10.132.当前conda环境依次执行下面命令:conda install cudatoolkit11.8 -c nvidia pip install torch2.1.1 torchvision0.16.1 torchaudio2.1.1 -f https://mirrors.aliyun.com/pyto…

Python爬虫实战: 爬虫常用到的技术及方案详解

爬虫是获取网络数据的重要工具,Python因其丰富的库生态系统而成为爬虫开发的首选语言。下面我将详细介绍Python爬虫的常用技术和方案。 一、基础技术栈 1. 请求库 Requests - 同步HTTP请求库 import requests# 基本GET请求 response = requests.get(https://httpbin.org/g…

k8s——持久化存储 PVC

目录 k8s持久化存储: PVC 1 k8s PV是什么? 2 k8s PVC是什么? 3 k8s PVC和PV工作原理 4 创建pod,使用pvc作为持久化存储卷 ​三种回收策略详解​ 1、创建nfs共享目录 2、如何编写pv的资源清单文件 3、创建pv 更新资源清单文…

【系统架构设计师】数据库设计(一):数据库技术的发展、数据模型、数据库管理系统、数据库三级模式

数据库技术是研究数据库的结构、存储、设计、管理和应用的一门软件学科。 数据库系统本质上是一个用计算机存储信息的系统。 数据库管理系统是位于用户与操作系统之间的一层数据管理软件,其基本目标是提供一个可以方便、有效地存取数据库信息的环境。 数据库就是信息…

深入理解 Structured Outputs:基于 JSON Schema 的结构化输出实践指南

深入理解 Structured Outputs:基于 JSON Schema 的结构化输出实践指南 目录 引言Structured Outputs 概述应用场景与优势核心用法:结构化响应的获取功能对比:Structured Outputs 与 JSON 模式典型应用示例链式思维(Chain of Tho…

大模型应用编排工具Dify之插件探索

1.前言 ​ dify 1.x版本以后插件功能丰富了很多,推出的插件市场上有各式各样的插件,比如 连接数据库、连接大模型、搜索和 mcp服务等。其中,有一个比较大的改动,模型供应商不再内置,而是通过插件的形式提供。因此&…

ubuntu2204安装搜狗拼音输入法

安装必要的软件包 sudo apt update sudo apt install fcitx5 fcitx5-chinese-addons fcitx5-config-qt fcitx5-configtool -y安装搜狗拼音 下载最新 .deb 包(官方地址:https://pinyin.sogou.com/linux/),安装: sudo dp…

三,设计模式-抽象工厂模式

目的 在 工厂模式 中,当需要创建新的产品时,则额外需要创建新的工厂,这种模式是对产品制造方法的抽象化,如果产品种类变多,则工厂数目变多,则代码规模会越来越大,且不同的产品类的生成依赖不同…

Vue3响应式编程核心:ref与reactive全方位对比

在Vue3的Composition API中,ref和reactive是构建响应式数据的核心工具。许多开发者对它们的选择存在困惑:何时用ref的.value?何时用reactive的直接访问?为何解构会丢失响应性?本文从原理、场景到实战陷阱,为…

Redis实战-缓存的解决方案(一)

1.什么是缓存缓存就是数据交换的缓存区,是存储数据的临时区域,读写性能高。浏览器会有缓存,tomcat服务器也会有缓存,数据库也会有缓存,CPU也会有缓存,磁盘也会有缓存,所以说缓存是无处不在的并且…

CI/CD企业案例详解

7.持续集成持续交付企业示例 为了让容器构建镜像可以持续集成并自动上传到harbor仓库,业务主机通过持续交付自动从仓库中下载镜像最近版本并实现业务更新7.1 在jenkins中添加registry节点 7.1.1 在业务节点中安装docker和java环境并配置其可以从仓库中下载镜像 # 新…

C++ 入门核心知识

一、C 课程概述与发展历史1. 发展历程:从 C 语言扩展到标准化C 的起源可追溯至 1979 年,由贝尔实验室的 Bjarne Stroustrup 主导开发。当时他为解决大型项目开发中 C 语言在可维护性和扩展性上的不足,在 C 语言基础上引入了面向对象编程特性。…

labelme数据标注保姆级教程:从安装到格式转换全流程,附常见问题避坑指南(含视频讲解)

引言:为什么选择labelme? 在人工智能和机器学习领域,高质量的标注数据是训练优秀模型的基础。而 labelme作为一款开源、跨平台的图像标注工具,凭借其强大的功能和易用性,成为了数据标注领域的热门选择。 它支持多种标…

人工智能-python-深度学习-自动微分

自动微分:基础概念与应用 自动微分(Autograd)是现代深度学习框架(如PyTorch、TensorFlow)中的一个核心功能。它通过构建计算图并在计算图上自动计算梯度,简化了反向传播算法的实现。以下是自动微分的基本概…