Skip to content

Instantly share code, notes, and snippets.

@O777GR
Created July 30, 2023 23:39
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save O777GR/e3cdf0d3f58d17c7b2d762ab00170069 to your computer and use it in GitHub Desktop.
Save O777GR/e3cdf0d3f58d17c7b2d762ab00170069 to your computer and use it in GitHub Desktop.
Python
from PyPDF2 import PdfFileReader, PdfFileWriter
from deep_translator import GoogleTranslator
from reportlab.lib.pagesizes import letter
from reportlab.pdfgen import canvas
from reportlab.platypus import Paragraph, Image
from reportlab.lib.styles import getSampleStyleSheet
# Установка языкового пары для перевода
src_lang = 'auto' # Исходный язык (автоопределение)
dst_lang = 'ru' # Язык, на который будет производиться перевод
# Путь к исходному PDF файлу
input_pdf = 'example.pdf'
# Путь к выходному PDF файлу
output_pdf = 'translated_example.pdf'
# Создание объекта PdfFileReader для чтения исходного PDF файла
pdf = PdfFileReader(input_pdf)
# Создание объекта PdfFileWriter для записи переведенного PDF
output = PdfFileWriter()
# Цикл по страницам исходного PDF файла
for page_num in range(pdf.getNumPages()):
page = pdf.getPage(page_num)
# Извлечение текста с текущей страницы
text = page.extractText().strip()
# Перевод текста с помощью Deepl
translated_text = GoogleTranslator(source=src_lang, target=dst_lang).translate(text)
# Создание нового PDF с отформатированным текстом
new_pdf = canvas.Canvas(f'page_{page_num+1}.pdf', pagesize=letter)
# Добавление переведенного текста на страницу
stylesheet = getSampleStyleSheet()
translated_paragraph = Paragraph(translated_text, stylesheet['BodyText'])
translated_paragraph.wrapOn(new_pdf, 500, 500) # Ограничение размеров текста
translated_paragraph.drawOn(new_pdf, 50, 500) # Положение текста
# Добавление изображений с текущей страницы
for i, image in enumerate(page.images.values()):
img_data = image.getData()
with open(f'image_{page_num+1}_{i}.jpg', 'wb') as f:
f.write(img_data)
new_pdf.drawImage(f'image_{page_num+1}_{i}.jpg', 50, 200 - i*100, 200, 100)
# Закрытие нового PDF файла
new_pdf.save()
# Чтение нового PDF файла и добавление его страниц в выходной PDF
with open(f'page_{page_num+1}.pdf', 'rb') as f:
translated_page = PdfFileReader(f)
output.addPage(translated_page.getPage(0))
# Запись переведенного PDF файла
with open(output_pdf, 'wb') as f:
output.write(f)
# Удаление временных файлов
for page_num in range(pdf.getNumPages()):
os.remove(f'page_{page_num+1}.pdf')
for i, _ in enumerate(page.images.values()):
os.remove(f'image_{page_num+1}_{i}.jpg')
print(f'Переведенный PDF сохранен в файл: {output_pdf}')
@yarleshiy
Copy link

Дружище, очень крутой код, но у меня ругается
Traceback (most recent call last):
File "C:\Users\vasilyev\PycharmProjects\pdf_translator\main.py", line 52, in
for i, image in enumerate(page.images.values()):
^^^^^^^^^^^^^^^^^^
AttributeError: 'list' object has no attribute 'values'

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment