gen_pdf_watermark.py 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import os.path
  2. import sys
  3. from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QPushButton, QFileDialog, QLineEdit, QScrollArea, QWidget, QVBoxLayout, QGridLayout
  4. from PyQt5.QtCore import Qt
  5. from PyPDF2 import PdfWriter, PdfReader
  6. from reportlab.pdfgen import canvas
  7. from reportlab.lib.pagesizes import letter
  8. class MainWindow(QMainWindow):
  9. def __init__(self):
  10. super().__init__()
  11. self.setWindowTitle("水印程序")
  12. x = 40
  13. y = 200
  14. interval = 45
  15. fixed_width = 200
  16. self.central_widget = QWidget(self)
  17. self.setCentralWidget(self.central_widget)
  18. self.layout = QVBoxLayout(self.central_widget)
  19. self.upload_button = QPushButton("上传文件", self)
  20. self.upload_button.move(140, 40)
  21. self.upload_button.clicked.connect(self.open_file_dialog)
  22. self.confirm_button = QPushButton("生成水印", self)
  23. self.confirm_button.move(380, 40)
  24. self.confirm_button.clicked.connect(self.start_watermark)
  25. # self.confirm_button = QPushButton("保存文件", self)
  26. # self.confirm_button.move(620, 40)
  27. self.clear_button = QPushButton("清除路径", self)
  28. self.clear_button.move(620, 40)
  29. self.clear_button.clicked.connect(self.clear_paths)
  30. self.load_label = QLabel("文件路径:", self)
  31. self.load_label.resize(2000, 50)
  32. self.load_label.move(40, 80)
  33. self.save_label = QLabel("", self)
  34. self.save_label.resize(2000, 50)
  35. self.save_label.move(40, 130)
  36. self.text_label = QLabel("水印内容:", self)
  37. self.text_label.move(x, y)
  38. y += interval
  39. self.text_input = QLineEdit(self)
  40. self.text_input.setText("默认水印文字")
  41. self.text_input.setFixedWidth(fixed_width)
  42. self.text_input.move(x + 90, y - 42)
  43. y += interval
  44. self.font_size_label = QLabel("字体大小:", self)
  45. self.font_size_label.setFixedWidth(fixed_width)
  46. self.font_size_label.move(x, y)
  47. y += interval
  48. self.font_size_input = QLineEdit(self)
  49. self.font_size_input.setFixedWidth(fixed_width)
  50. self.font_size_input.setText("12")
  51. self.font_size_input.move(x + 90, y - 42)
  52. y += interval
  53. self.x_label = QLabel("X 坐标:", self)
  54. self.x_label.setFixedWidth(fixed_width)
  55. self.x_label.move(x, y)
  56. y += interval
  57. self.x_input = QLineEdit(self)
  58. self.x_input.setFixedWidth(fixed_width)
  59. self.x_input.setText("100")
  60. self.x_input.move(x + 90, y - 42)
  61. y += interval
  62. self.y_label = QLabel("Y 坐标:", self)
  63. self.y_label.setFixedWidth(fixed_width)
  64. self.y_label.move(x, y)
  65. y += interval
  66. self.y_input = QLineEdit(self)
  67. self.y_input.setFixedWidth(fixed_width)
  68. self.y_input.setText("100")
  69. self.y_input.move(x + 90, y - 42)
  70. self.file_path = ""
  71. def open_file_dialog(self):
  72. options = QFileDialog.Options()
  73. file_path, _ = QFileDialog.getOpenFileName(
  74. self, "选择文件", "", "PDF文件 (*.pdf)", options=options)
  75. if file_path:
  76. self.file_path = file_path
  77. self.load_label.setText(f"文件路径: {self.file_path}")
  78. self.clear_button.clicked.connect(self.clear_paths)
  79. def start_watermark(self):
  80. if self.file_path:
  81. self.add_watermark()
  82. else:
  83. self.load_label.setText(f"文件路径: ↑↑↑点这里!!\n\t整个PDF文件来这里,再生成水印!!!!")
  84. def add_watermark(self):
  85. file_path = self.file_path
  86. text = self.text_input.text()
  87. font_size = int(self.font_size_input.text())
  88. x = int(self.x_input.text())
  89. y = int(self.y_input.text())
  90. output_path = file_path.replace(".pdf", "_watermarked.pdf")
  91. input_pdf = PdfReader(open(file_path, "rb"))
  92. output_pdf = PdfWriter()
  93. num_pages = len(input_pdf.pages)
  94. # 创建水印PDF
  95. watermark_path = "watermark.pdf"
  96. c = canvas.Canvas(watermark_path, pagesize=letter)
  97. c.setFont("Helvetica", font_size)
  98. c.setFillAlpha(0.25) # 尝试注释掉这行,看是否是透明度的问题
  99. c.saveState()
  100. c.translate(400, 500) # 确保坐标在页面内,并且合适地调整
  101. c.rotate(45)
  102. c.drawCentredString(x, y, text) # 确保坐标是正确的
  103. c.restoreState()
  104. c.showPage() # 添加这一行来完成页面
  105. c.save()
  106. watermark_pdf = PdfReader("watermark.pdf")
  107. watermark_page = watermark_pdf.pages[0]
  108. for page_num in range(num_pages):
  109. page = input_pdf.pages[page_num]
  110. page.merge_page(watermark_page)
  111. output_pdf.add_page(page)
  112. with open(output_path, "wb") as f:
  113. output_pdf.write(f)
  114. # if os.path.exists("watermark.pdf"):
  115. # os.remove("watermark.pdf")
  116. self.save_label.setText(f"生成路径: {output_path}")
  117. print('已生成水印')
  118. def clear_paths(self):
  119. self.file_path = ""
  120. self.load_label.setText("文件路径:")
  121. self.save_label.setText("")
  122. if __name__ == "__main__":
  123. app = QApplication(sys.argv)
  124. app.setStyleSheet("QLabel, QLineEdit, QPushButton { font-size: 16px; }")
  125. window = MainWindow()
  126. window.resize(1000, 600) # 设置窗口大小为 1000x600
  127. window.show()
  128. sys.exit(app.exec_())