Утилита для массовой вставки скрытых символов в документ Word



Небольшой проект на Python. Принцип работы:

В окне предварительно указывается символ в десятичном формате. Далее добавляется количество символов, через которые будет производиться вставка. Первая кнопка — выбор файла, вторая — запуск модификации. Новый файл сохраняется в том же каталоге с измененным названием.

Полная таблица ASCII (0-127) — https://www.asciitable.com/

Полная база Unicode — https://symbl.cc/ru/unicode-table/

Утилиту можно использовать для тестирования сервисов проверки на плагиат (Антиплагиат.ВУЗ и аналоги). Ранее аналогичную схему использовали для обхода таких сервисов — добавление скрытых символов делало текст абсолютно уникальным, хотя визуально он выглядел точно также. Суть достаточно проста: подобрать символ, который не определяется системой и не отображается визуально.

Далее будет код программы и скомпилированные файл exe. Код можно использовать в качестве основы для своих проектов, адаптируя по собственные задачи.

Скомпилированный файл: https://disk.yandex.ru/d/YkTXSU5ZTPAdDA

import tkinter as tk
from tkinter import filedialog, messagebox
from docx import Document
import os
import re

def is_word_char(char):
    """Проверяет, является ли символ частью слова (буква или цифра)"""
    return char.isalpha() or char.isdigit()

def insert_symbol_inside_words():
    file_path = file_entry.get()
    if not file_path:
        messagebox.showerror("Ошибка", "Файл не выбран!")
        return

    try:
        char_code = int(char_entry.get())
        symbol = chr(char_code)
    except ValueError:
        messagebox.showerror("Ошибка", "Некорректный код символа! Введите число (например, 46 для точки)")
        return

    try:
        interval = int(interval_entry.get())
        if interval <= 0:
            raise ValueError
    except ValueError:
        messagebox.showerror("Ошибка", "Интервал должен быть целым числом > 0")
        return

    try:
        doc = Document(file_path)

        def process_text(text):
            result = []
            word_chars_count = 0
            
            for char in text:
                if is_word_char(char):
                    word_chars_count += 1
                    result.append(char)
                    if word_chars_count % interval == 0:
                        result.append(symbol)
                else:
                    word_chars_count = 0
                    result.append(char)
            
            return ''.join(result)

        # Обработка параграфов
        for paragraph in doc.paragraphs:
            if paragraph.text:
                paragraph.text = process_text(paragraph.text)

        # Обработка таблиц
        for table in doc.tables:
            for row in table.rows:
                for cell in row.cells:
                    for paragraph in cell.paragraphs:
                        if paragraph.text:
                            paragraph.text = process_text(paragraph.text)

        # Сохранение файла
        base_name, ext = os.path.splitext(file_path)
        new_file_path = f"{base_name}_modified{ext}"
        doc.save(new_file_path)
        messagebox.showinfo("Успех", f"Файл сохранён как:\n{new_file_path}")

    except Exception as e:
        messagebox.showerror("Ошибка", f"Произошла ошибка:\n{str(e)}")

def select_file():
    file_path = filedialog.askopenfilename(
        title="Выберите файл Word",
        filetypes=[("Word Files", "*.docx"), ("All Files", "*.*")]
    )
    if file_path:
        file_entry.delete(0, tk.END)
        file_entry.insert(0, file_path)

# Настройка GUI
root = tk.Tk()
root.title("Модификатор Word-файлов (внутри слов)")
root.geometry("500x200")

# Поле для кода символа (десятичный формат)
tk.Label(root, text="Код символа (десятичный):").pack(pady=5)
char_entry = tk.Entry(root, width=10)
char_entry.pack()
char_entry.insert(0, "46")  # 46 = точка (.)

# Поле для интервала
tk.Label(root, text="Количество символов внутри слов:").pack(pady=5)
interval_entry = tk.Entry(root, width=5)
interval_entry.pack()
interval_entry.insert(0, "3")

# Поле для выбора файла
tk.Label(root, text="Файл Word:").pack(pady=5)
file_entry = tk.Entry(root, width=50)
file_entry.pack(pady=5)
tk.Button(root, text="Выбрать файл", command=select_file).pack()

# Кнопка обработки
tk.Button(
    root,
    text="Вставить символ внутри слов",
    command=insert_symbol_inside_words
).pack(pady=10)
tk.Label(root, text="Файл будет создан в том же каталоге").pack()

root.mainloop()


Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: