import os.path import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QFileDialog, QLineEdit, QScrollArea, QWidget, QVBoxLayout, QGridLayout from PyQt5.QtCore import Qt from PyPDF2 import PdfWriter, PdfReader from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import letter class MainWindow(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("水印程序") x = 40 y = 200 interval = 45 fixed_width = 200 self.central_widget = QWidget(self) self.setCentralWidget(self.central_widget) self.layout = QVBoxLayout(self.central_widget) self.upload_button = QPushButton("上传文件", self) self.upload_button.move(140, 40) self.upload_button.clicked.connect(self.open_file_dialog) self.confirm_button = QPushButton("生成水印", self) self.confirm_button.move(380, 40) self.confirm_button.clicked.connect(self.start_watermark) # self.confirm_button = QPushButton("保存文件", self) # self.confirm_button.move(620, 40) self.clear_button = QPushButton("清除路径", self) self.clear_button.move(620, 40) self.clear_button.clicked.connect(self.clear_paths) self.load_label = QLabel("文件路径:", self) self.load_label.resize(2000, 50) self.load_label.move(40, 80) self.save_label = QLabel("", self) self.save_label.resize(2000, 50) self.save_label.move(40, 130) self.text_label = QLabel("水印内容:", self) self.text_label.move(x, y) y += interval self.text_input = QLineEdit(self) self.text_input.setText("默认水印文字") self.text_input.setFixedWidth(fixed_width) self.text_input.move(x + 90, y - 42) y += interval self.font_size_label = QLabel("字体大小:", self) self.font_size_label.setFixedWidth(fixed_width) self.font_size_label.move(x, y) y += interval self.font_size_input = QLineEdit(self) self.font_size_input.setFixedWidth(fixed_width) self.font_size_input.setText("12") self.font_size_input.move(x + 90, y - 42) y += interval self.x_label = QLabel("X 坐标:", self) self.x_label.setFixedWidth(fixed_width) self.x_label.move(x, y) y += interval self.x_input = QLineEdit(self) self.x_input.setFixedWidth(fixed_width) self.x_input.setText("100") self.x_input.move(x + 90, y - 42) y += interval self.y_label = QLabel("Y 坐标:", self) self.y_label.setFixedWidth(fixed_width) self.y_label.move(x, y) y += interval self.y_input = QLineEdit(self) self.y_input.setFixedWidth(fixed_width) self.y_input.setText("100") self.y_input.move(x + 90, y - 42) self.file_path = "" def open_file_dialog(self): options = QFileDialog.Options() file_path, _ = QFileDialog.getOpenFileName( self, "选择文件", "", "PDF文件 (*.pdf)", options=options) if file_path: self.file_path = file_path self.load_label.setText(f"文件路径: {self.file_path}") self.clear_button.clicked.connect(self.clear_paths) def start_watermark(self): if self.file_path: self.add_watermark() else: self.load_label.setText(f"文件路径: ↑↑↑点这里!!\n\t整个PDF文件来这里,再生成水印!!!!") def add_watermark(self): file_path = self.file_path text = self.text_input.text() font_size = int(self.font_size_input.text()) x = int(self.x_input.text()) y = int(self.y_input.text()) output_path = file_path.replace(".pdf", "_watermarked.pdf") input_pdf = PdfReader(open(file_path, "rb")) output_pdf = PdfWriter() num_pages = len(input_pdf.pages) # 创建水印PDF watermark_path = "watermark.pdf" c = canvas.Canvas(watermark_path, pagesize=letter) c.setFont("Helvetica", font_size) c.setFillAlpha(0.25) # 尝试注释掉这行,看是否是透明度的问题 c.saveState() c.translate(400, 500) # 确保坐标在页面内,并且合适地调整 c.rotate(45) c.drawCentredString(x, y, text) # 确保坐标是正确的 c.restoreState() c.showPage() # 添加这一行来完成页面 c.save() watermark_pdf = PdfReader("watermark.pdf") watermark_page = watermark_pdf.pages[0] for page_num in range(num_pages): page = input_pdf.pages[page_num] page.merge_page(watermark_page) output_pdf.add_page(page) with open(output_path, "wb") as f: output_pdf.write(f) # if os.path.exists("watermark.pdf"): # os.remove("watermark.pdf") self.save_label.setText(f"生成路径: {output_path}") print('已生成水印') def clear_paths(self): self.file_path = "" self.load_label.setText("文件路径:") self.save_label.setText("") if __name__ == "__main__": app = QApplication(sys.argv) app.setStyleSheet("QLabel, QLineEdit, QPushButton { font-size: 16px; }") window = MainWindow() window.resize(1000, 600) # 设置窗口大小为 1000x600 window.show() sys.exit(app.exec_())