一、背景:国内行情和国际行情造成信创化国产要求越来越高,传统.net项目市场越来越少

在技术发展的浪潮中,软件开发领域的技术更新换代速度极快。近年来,国内信创化国产要求随着国际形势的变化以及国内产业升级的需求越来越高。国际上,一些技术封锁和限制使得国内企业对自主可控的信息技术需求愈发迫切;国内也出台了一系列政策推动信创产业发展,各行业纷纷加速国产化替代进程。这直接导致传统.NET 项目的市场空间越来越小,许多原本专注于.NET 开发的人员面临着职业发展的新挑战,不少人将目光转向了 JAVA 和 Python 等更具市场潜力的编程语言。

二、困难:对于之前精通.net的开发人员来说如果再去学习Java和Python可能精力时间不够

然而,对于之前精通.NET 的开发人员来说,学习 JAVA 和 Python 并非易事。.NET 开发人员长期沉浸在 C# 等.NET 相关技术体系中,已经形成了一套固定的开发思维和习惯。JAVA 和 Python 在语法规则、编程范式、开发框架以及生态系统等方面与.NET 存在较大差异。例如,JAVA 的面向对象特性虽然与.NET 有相通之处,但在框架的使用上,如 Spring 框架的整套生态体系,需要重新学习和适应;Python 作为一种动态类型语言,其简洁的语法和灵活的编程方式,要求开发者转变思维方式,同时 Python 丰富的第三方库和不同的项目架构模式,也需要花费大量时间去熟悉。对于许多开发人员来说,工作中本就承担着较大的项目压力,还要抽出精力和时间去学习全新的语言体系,难免会感到力不从心。

三、解决办法:利用AI大模型实现开发语言快速转换,充分利用其优势直接让其在具体项目中完成开发语言转换

不过,幸运的是,随着 AI 技术的快速发展,AI 大模型成为了开发人员的智慧大脑,为解决开发语言转换问题提供了高效的解决方案。AI 大模型具有强大的数据分析和学习能力,能够快速理解不同编程语言的语法规则、代码逻辑和项目架构。利用 AI 大模型,开发人员可以实现开发语言的快速转换,无需完全从零开始学习新语言的所有细节,而是可以借助 AI 的优势,在具体项目中直接完成开发语言的转换工作。例如,在面对一个需要从.NET 转换到 JAVA 或 Python 的项目时,AI 可以根据已有的.NET 代码,分析其功能和逻辑,自动生成对应的 JAVA 或 Python 代码框架和核心逻辑,大大减少开发人员的学习成本和开发时间。

四、具体如何做:合并PDF程序不同开发语言项目实战

以合并PDF程序为例,我本身是精通C#Winform编程的,对C#语言很熟悉。现在我准备自学python,但是对python我之前没了解过,完全不懂,但是通过网上基础搜索配置环境后,通过豆包AI平台可以快速实现相同的编程语言开发,发布后即可成为exe程序。本文先重点介绍下整体效果,我先用c#实现了这一功能,然后用python1小时内实现了同样的功能。如python环境如何配置网上都有很多教程,本次暂时不做介绍。如果有需要后面我会专门写个.net开发人员如何一点点进行Python、JAVA环境配置的,站在.net视角去借助AI了解其他语言,会有事半功倍的效果。

1、实际需求来源:

由于经常开车出差,需要报销ETC电子发票,在山东这边单趟的ETC过路费发票都得给拆分为好几张,多的时候一次能用7、8张,回来打印报销的时候需要一张张打印,非常麻烦。常用的PDF软件有些合并是需要收费的,网上在线的也很多不靠谱。所以就萌生了自己写个合并PDF的exe程序的想法。

2、C#合并pdf的Winform程序:

首先是想到是我最擅长的C#Winform程序,把需求扔个豆包AI,交流过程如下

生成的代码直接复制到Visual Studio运行编译后生成后,合并程序就完成了,这个效果在3年之前是完全不敢想的,当时AI生成的程序还需要反复调试才能运行,现在是生成后拿过来就可以用了。效果如下,测试功能都可正常运行:

3、Python合并PDF程序

由于我之前完全没有接触过Python,对Python完全不懂,但是基于.net的理解,我认为Python应该也可以做同样的功能,随即再次询问了AI

将生成的代码放到VScode进行编译后,直接可正常运行,至此我虽然不懂Python,但是不妨碍我用Python完成这个程序。运行效果图如下

生成的源码如下,如果有想尝试的可以自己问豆包的AI试试,或者是直接拿着我这个程序

import os
# 导入 pypdf 库中的 PdfWriter 和 PdfReader 类,用于读取和写入 PDF 文件
# 对应 C# 中,可使用 iTextSharp 库来处理 PDF,例如 PdfReader 和 PdfWriter 类
from pypdf import PdfWriter, PdfReader
import tkinter as tk
# 导入 tkinter 库中的文件对话框、消息框和下拉框组件
from tkinter import filedialog, messagebox, ttk

# 全局变量,用于存储用户选择的 PDF 文件路径
selected_pdf = None

def select_pdf_file():
    """
    该函数用于弹出文件选择对话框,让用户选择要处理的 PDF 文件
    并更新界面上显示的文件信息
    """
    # 弹出文件选择对话框,只允许选择 PDF 文件
    file_path = filedialog.askopenfilename(
        title="选择要处理的 PDF 文件", filetypes=[("PDF 文件", "*.pdf")])
    if file_path:
        global selected_pdf
        # 将用户选择的文件路径赋值给全局变量
        selected_pdf = file_path
        # 更新界面上的标签,显示已选择的文件名
        pdf_label.config(text=f"已选择文件: {os.path.basename(file_path)}")
    # 在 C# 中,可使用 OpenFileDialog 类来实现文件选择功能,示例代码如下:
    # OpenFileDialog openFileDialog = new OpenFileDialog();
    # openFileDialog.Filter = "PDF 文件|*.pdf";
    # if (openFileDialog.ShowDialog() == DialogResult.OK)
    # {
    #     string selectedFilePath = openFileDialog.FileName;
    #     // 处理选择的文件路径
    # }

def merge_pages():
    """
    该函数用于将用户选择的 PDF 文件的页面按指定规则合并
    并保存为新的 PDF 文件
    """
    if not selected_pdf:
        # 如果用户没有选择 PDF 文件,弹出警告消息框
        messagebox.showwarning("警告", "请先选择要处理的 PDF 文件!")
        return
    # 获取用户选择的每页合并页数
    pages_per_sheet = int(pages_per_sheet_var.get())
    # 弹出保存文件对话框,让用户指定合并后 PDF 文件的保存路径
    output_path = filedialog.asksaveasfilename(
        title="保存合并后的 PDF 文件", defaultextension=".pdf",
        filetypes=[("PDF 文件", "*.pdf")])
    if output_path:
        try:
            # 创建 PdfReader 对象,用于读取用户选择的 PDF 文件
            reader = PdfReader(selected_pdf)
            # 创建 PdfWriter 对象,用于写入合并后的 PDF 文件
            writer = PdfWriter()
            # 用于存储当前页面组的列表
            current_page_group = []
            # 遍历 PDF 文件的每一页
            for page_num in range(len(reader.pages)):
                page = reader.pages[page_num]
                # 将当前页面添加到页面组中
                current_page_group.append(page)
                if len(current_page_group) == pages_per_sheet:
                    # 如果页面组中的页面数量达到用户指定的每页合并页数
                    first_page = current_page_group[0]
                    # 获取第一页的宽度
                    page_width = float(first_page.mediabox[2])
                    # 获取第一页的高度
                    page_height = float(first_page.mediabox[3])
                    # 在合并后的 PDF 中添加一个空白页,高度为原页面高度乘以每页合并页数
                    new_page = writer.add_blank_page(
                        width=page_width,
                        height=page_height * pages_per_sheet
                    )
                    # 遍历页面组中的每一页,将其合并到新页面上
                    for i, page in enumerate(current_page_group):
                        new_page.merge_transformed_page(
                            page,
                            [1, 0, 0, 1, 0, i * page_height]
                        )
                    # 清空页面组,准备下一组页面的合并
                    current_page_group = []

            if current_page_group:
                # 如果最后一组页面数量不足每页合并页数
                first_page = current_page_group[0]
                page_width = float(first_page.mediabox[2])
                page_height = float(first_page.mediabox[3])
                # 补空白页,直到页面组中的页面数量达到每页合并页数
                while len(current_page_group) < pages_per_sheet:
                    blank_page = writer.add_blank_page(
                        width=page_width,
                        height=page_height
                    )
                    current_page_group.append(blank_page)
                new_page = writer.add_blank_page(
                    width=page_width,
                    height=page_height * pages_per_sheet
                )
                for i, page in enumerate(current_page_group):
                    new_page.merge_transformed_page(
                        page,
                        [1, 0, 0, 1, 0, i * page_height]
                    )

            # 以二进制写入模式打开用户指定的保存文件路径
            with open(output_path, 'wb') as output_file:
                # 将合并后的 PDF 内容写入文件
                writer.write(output_file)
            # 弹出消息框,提示用户合并成功
            messagebox.showinfo("成功", f"PDF 文件页面已成功合并到 {output_path}")
        except Exception as e:
            # 如果合并过程中出现异常,弹出错误消息框显示错误信息
            messagebox.showerror("错误", f"合并过程中出现错误:{str(e)}")
    # 在 C# 中,使用 iTextSharp 库实现类似功能的示例代码较为复杂,大致思路如下:
    # using iTextSharp.text;
    # using iTextSharp.text.pdf;
    # using System.IO;
    # // 读取 PDF 文件
    # PdfReader reader = new PdfReader(selectedFilePath);
    # Document document = new Document();
    # PdfCopy writer = new PdfCopy(document, new FileStream(outputFilePath, FileMode.Create));
    # document.Open();
    # // 处理页面合并逻辑
    # // ...
    # document.Close();
    # writer.Close();

# 创建 Tkinter 主窗口
root = tk.Tk()
# 设置主窗口的标题
root.title("单 PDF 页面合并")

# 创建选择文件按钮,点击时调用 select_pdf_file 函数
select_button = tk.Button(root, text="选择 PDF 文件",
                          command=select_pdf_file)
# 将按钮添加到主窗口,并设置垂直间距
select_button.pack(pady=10)

# 创建标签,用于显示用户选择的文件信息
pdf_label = tk.Label(root, text="未选择文件")
pdf_label.pack(pady=5)

# 创建标签,提示用户选择每页合并页数
pages_per_sheet_label = tk.Label(root, text="每页合并页数:")
pages_per_sheet_label.pack(pady=5)

# 创建字符串变量,用于存储用户选择的每页合并页数
pages_per_sheet_var = tk.StringVar(root)
# 设置默认值为 2
pages_per_sheet_var.set("2")
# 定义每页合并页数的可选值
pages_per_sheet_options = ["2", "3", "4"]
# 创建下拉框,让用户选择每页合并页数
pages_per_sheet_menu = ttk.Combobox(
    root, textvariable=pages_per_sheet_var, values=pages_per_sheet_options)
pages_per_sheet_menu.pack(pady=5)

# 创建合并按钮,点击时调用 merge_pages 函数
merge_button = tk.Button(root, text="合并页面", command=merge_pages)
merge_button.pack(pady=10)

# 进入 Tkinter 主事件循环,使窗口保持显示并响应用户操作
root.mainloop()

五、总结

在信创化国产要求不断提高的背景下,.NET 开发人员转向 JAVA、Python 等语言虽然面临一定压力,但 AI 大模型的出现为我们提供了强大的支持。它让开发语言转换变得更加简单高效,让我们能够在具体项目中快速应用新语言,实现功能开发。随着 AI 技术的不断发展,它将成为开发人员精通各种编程语言的有力工具,帮助我们在技术发展的浪潮中始终保持竞争力,轻松成为精通多种编程语言的专家。AI成为我们最好的编程老师和编程助手,以前需要专门自己搜索资料、自己学习才能学的语法,只需要一句话,AI即可帮你实现,挑战一切不可能。

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐