PDF页面倒序

今天遇到一个问题,把项目资料扫描电子版归档,扫描完后发现某个资料排序是从最新到最旧,想着如何倒序排列。尝试了几个常用的PDF阅读器,没发现类似的功能,于是尝试用python来实现。

import fitz  # PyMuPDF
import os
#定义函数
def reverse_pdf_order(input_pdf_path, output_pdf_path):
    source_pdf = fitz.open(input_pdf_path)  # 打开pdf
    reversed_pdf = fitz.open()  # 新建pdf

    # Iterate through the pages in reverse order
    for page_number in range(source_pdf.page_count - 1, -1, -1):
        # 插入页面
        reversed_pdf.insert_pdf(source_pdf, from_page=page_number, to_page=page_number)

    reversed_pdf.save(output_pdf_path)  # 保存生成的pdf
    source_pdf.close()  # 关闭输入pdf
    reversed_pdf.close()  # 关闭生成的pdf

folder = 'd:/Desktop/' #指定工作目录
os.chdir(folder)       #切换到工作目录
input = 'input.pdf'    #需要调整页面顺序的文件
reverse_pdf_order(input, 'reversed_' + input) #生成文件

当然,可以改造代码批量转换,就不多说了。

批量汇总多个dwg文件的材料标准并汇总成物料表

以下为代码,并都进行了标注。

# 导入必要的包
import pyautocad as pc
import numpy as np
from pathlib import Path
import win32com.client
import pythoncom
import time
import pandas as pd
import subprocess
#定义函数
def material_extraction(file_path):
    dwg_files = Path(file_path).glob('*.dwg') #获取所有dwg文件
    material_dict = {} #创建空字典
    for dwg_file in dwg_files: #遍历所有dwg文件
        acad= win32com.client.gencache.EnsureDispatch("AutoCAD.Application") #调用AutoCAD
        print(f'Openning {dwg_file}') #打印打开的文件名
        doc2 = acad.Documents.Open(dwg_file) #打开cad文件
        time.sleep(5) #休眠5秒钟,避免打开时间过长
        model = doc2.ModelSpace #获取模型空间
        pyacad = pc.Autocad(create_if_not_exists = True) #创建一个新的pyautocad对象
        model_space = pyacad.model #获取模型空间
        uptext = [] #创建空列表
        try: #尝试执行下面的代码
            for obj in pyacad.iter_objects_fast('TDbSymbMultiLeader',container=model_space): #遍历模型空间中的所有TDbSymbMultiLeader对象
                uptext.append(obj.uptext) #将uptext属性添加到uptext列表中
            material_dict[doc2.Name] = tuple(set(uptext)) #将文件名作为key,uptext列表作为value,添加到material_dict字典中
        except: #如果上面的代码执行失败,执行下面的代码
            print(f'{dwg_file}  failed') #打印失败的文件名
        doc2.Close() #关闭文件
    df = pd.DataFrame.from_dict(material_dict,orient='index').T #将material_dict字典转换为DataFrame对象
    df.to_csv(Path(file_path)/'物料表.csv',encoding='gb2312') #将DataFrame对象转换为csv文件
    print(f'打开项目文件夹:{file_path}') #打印打开的文件路径
    subprocess.Popen(f'explorer {file_path}') #打开文件路径
file_path = Path.cwd() #设置文件路径
material_extraction(file_path) #调用函数

Python中单引号和双引号

在Python中我们都知道单引号和双引号都可以用来表示一个字符串,比如

str1 = 'python'
str2 = "python"

str1和str2是没有任何区别的。

我们知道Python以其易用性而著名,所以刚开始看教程学习看到单引号和双引号都可以使用会以为这是Python为了方便程序员,随便用哪个就好,不用担心用错。其实,背后的原因不只是这么简单。举个例子,想想I’m a big fans of Python.这个字符串应该怎么定义。

单引号版本:

str3 = 'I\'m a big fan of Python.'

可以注意到,原来的字符串中有一个’,而Python又允许使用单引号’ ‘来表示字符串,所以字符串中间的’必须用转移字符\才可以。字符串中间只有一个’,这样写看起来还好,但是如果是We all know that ‘A’ and ‘B’ are two capital letters.这个字符串呢?

str4 = 'We all know that \'A\' and \'B\' are two capital letters.'

怎么样,是不是看起来就很不好看,而且很容易出错了?这个时候就是双引号也可以表示字符串该体现作用的时候了。下面是str4的双引号版本:

str4_ = "We all know that 'A' and 'B' are two capital letters."

这样是不是看起来就人性化多了?没错,这就是Python支持双引号和单引号都能用来定义字符串的原因。

反之,如果字符串中有双引号,为了避免使用转义符,你可以使用单引号来定义这个字符串。比如:

str5 = 'The teacher said: "Practice makes perfect" is a very famous proverb.'

这就是Python易用性和人性化的一个极致体现,当你用单引号’ ‘定义字符串的时候,它就会认为你字符串里面的双引号” “是普通字符,从而不需要转义。反之当你用双引号定义字符串的时候,就会认为你字符串里面的单引号是普通字符无需转义。
————————————————
版权声明:本文为CSDN博主「邓无邪」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/woainishifu/article/details/76105667

跟随教程练习的Python小小小程序

sercet_word = "test"
guess = ""
guess_count = 0
guess_limit = 3
out_of_guesses = False
while guess != sercet_word and not out_of_guesses:
    if guess_count < guess_limit:
       guess = input("Guess the word: ")
       guess_count += 1
    else:
        out_of_guesses = True
if out_of_guesses:
    print("Out of guesses,You lose!")
else:
    print("You Win!")

跟随教程练习了这么一个小程序,将if、loop、input等都运用上了,虽然很简单,但是尽量让自己的思维方式与程序员靠近。