ASSISTANT
Хорошо! Давайте соберем полную и исправленную версию приложения PDF Reader на PyQt6 с учетом всех предыдущих замечаний и улучшений. Вот финальный код:
```python
import sys
import fitz # PyMuPDF
import json
import os
from PyQt6.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout,
QPushButton, QLabel, QFileDialog, QMessageBox, QInputDialog, QScrollArea)
from PyQt6.QtGui import QPixmap, QImage
from PyQt6.QtCore import Qt
class PDFReader(QWidget):
def __init__(self):
super().__init__()
self.setWindowTitle("PDF Reader")
self.page_number = 0
self.zoom_level = 1.0 # Уровень масштабирования
self.notes = {}
self.pdf_document = None
self.current_file_path = None
# Инициализация интерфейса
self.layout = QVBoxLayout(self)
# Метка для отображения изображения
self.img_label = QLabel(self)
self.layout.addWidget(self.img_label)
# Область прокрутки
self.scroll_area = QScrollArea(self)
self.scroll_area.setWidgetResizable(True)
self.scroll_area.setWidget(self.img_label)
self.layout.addWidget(self.scroll_area)
# Кнопки
self.button_layout = QHBoxLayout()
self.layout.addLayout(self.button_layout)
open_button = QPushButton("Открыть PDF", self)
open_button.clicked.connect(self.open_pdf)
self.button_layout.addWidget(open_button)
note_button = QPushButton("Заметка", self)
note_button.clicked.connect(self.add_note)
self.button_layout.addWidget(note_button)
exit_button = QPushButton("Выход", self)
exit_button.clicked.connect(self.close)
self.button_layout.addWidget(exit_button)
self.load_initial_progress()
def load_initial_progress(self):
if os.path.exists("progress.json"):
with open("progress.json", "r") as f:
progress = json.load(f)
self.current_file_path = progress.get("file_path")
self.page_number = progress.get("page_number", 0)
if self.current_file_path and os.path.exists(self.current_file_path):
self.pdf_document = fitz.open(self.current_file_path)
self.load_page(self.page_number)
def open_pdf(self):
file_path, _ = QFileDialog.getOpenFileName(self, "Открыть PDF", "", "PDF files (*.pdf)")
if file_path:
self.current_file_path = file_path
self.pdf_document = fitz.open(file_path)
self.page_number = 0
self.load_page(self.page_number)
def load_page(self, page_number):
if self.pdf_document is not None and 0 <= page_number < len(self.pdf_document):
page = self.pdf_document[page_number]
pix = page.get_pixmap(matrix=fitz.Matrix(self.zoom_level, self.zoom_level))
# Создание QImage из массива байтов
image_data = pix.tobytes("png")
image = QImage()
image.loadFromData(image_data)
# Создание QPixmap из QImage
pixmap = QPixmap.fromImage(image)
self.img_label.setPixmap(pixmap)
self.setWindowTitle(f"PDF Reader - {self.current_file_path} - Страница {page_number + 1}")
def add_note(self):
note, ok = QInputDialog.getText(self, "Заметка", "Введите вашу заметку:")
if ok and note and self.pdf_document:
self.notes[self.page_number] = note
QMessageBox.information(self, "Заметка", f"Заметка добавлена на странице {self.page_number + 1}: {note}")
def save_progress(self):
if self.current_file_path:
with open("progress.json", "w") as f:
json.dump({"file_path": self.current_file_path, "page_number": self.page_number}, f)
def wheelEvent(self, event):
if event.angleDelta().y() > 0:
self.next_page()
else:
self.prev_page()
def next_page(self):
if self.pdf_document and self.page_number < len(self.pdf_document) - 1:
self.page_number += 1
self.load_page(self.page_number)
def prev_page(self):
if self.pdf_document and self.page_number > 0:
self.page_number -= 1
self.load_page(self.page_number)
if __name__ == "__main__":
app = QApplication(sys.argv)
pdf_reader = PDFReader()
pdf_reader.resize(800, 600)
pdf_reader.show()
sys.exit(app.exec())
```
### Объяснение изменений:
1. **Импортирование необходимых классов:** Мы используем `QPixmap` и `QImage` для обработки изображений, а также `QInputDialog` и `QMessageBox` для обработки заметок.
2. **Метод `load_page`:** Исправлено создание изображения, теперь используется `QImage.loadFromData()`, чтобы преобразовать массив байтов в изображение.
3. **Обработка событий мыши:** Добавлен метод `wheelEvent`, чтобы переходить между страницами при прокрутке колесика мыши.
4. **Грузит PDF файл:** При открытии PDF файла происходит загрузка первой страницы и, если доступен, сохранённый прогресс.
Теперь приложение должно отображать страницы PDF без ошибок, и вы сможете добавлять заметки и переключаться между страницами без проблем. Если у вас есть дополнительные требования или изменения, пожалуйста, дайте знать!