| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- 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_())
|