Задать вопрос

Как при помощи языка Python создать спецификацию ГОСТ 2.108-68 ЕСКД в формате docx?

Суть такова. Нужно создать программу, которая создает документ-спецификацию ГОСТ 2.108-68 ЕСКД. Причем все должно быть в точности, как в нижней картинке.
680240125d772256669310.png
Я пробовал сделать по разному. К сожалению, у меня либо не получалось, либо же делает таблицу не так, как показано.
Могу скинуть пример кода. То неправильный размер, то ещё чего-нибудь.
import aspose.words as aw

def mm_to_points(mm):
    return mm * 2.83  # 1 мм ≈ 2.83 пункта

doc = aw.Document()
builder = aw.DocumentBuilder(doc)

# Шрифт ГОСТ
builder.font.name = "Arial"
builder.font.size = 10

# Верхние поля
builder.writeln("Перв. примен.: ___________________     Справ №: ________________     Подпись и дата: ________________")
builder.writeln("Инд. № дуб: _______________________     Взам. инв. №: ________________\n")

# Столбцы и размеры
columns = [
    ("Поз. обозн.", 20),
    ("ФВМТ.465255.012", 35),
    ("Наименование", 100),
    ("Кол.", 15),
    ("Примечание", 40)
]

# Начинаем таблицу
table = builder.start_table()  # Это объект таблицы

# Добавляем хотя бы одну строку перед применением форматирования
builder.insert_cell()  # Первая ячейка
builder.write(columns[0][0])  # Первая ячейка

# Теперь применяем настройки таблицы
table.allow_auto_fit = False

builder.row_format.height = mm_to_points(7)
builder.row_format.height_rule = aw.HeightRule.EXACTLY
builder.paragraph_format.alignment = aw.ParagraphAlignment.CENTER
builder.font.bold = True

# Продолжаем заголовок
for header, width_mm in columns:
    builder.cell_format.width = mm_to_points(width_mm)
    if header != columns[0][0]:  # первую ячейку уже записали
        builder.insert_cell()
        builder.write(header)
builder.end_row()

# Тело таблицы
builder.font.bold = False
builder.paragraph_format.alignment = aw.ParagraphAlignment.LEFT
builder.row_format.height = mm_to_points(6)

for _ in range(15):
    for _, width_mm in columns:
        builder.insert_cell()
        builder.cell_format.width = mm_to_points(width_mm)
        builder.write("")
    builder.end_row()

builder.end_table()

# Пробел перед подвалом
builder.writeln("\n")

# Основная надпись (нижняя часть)
builder.start_table()
builder.row_format.height = mm_to_points(6)
builder.font.size = 9

footer_data = [
    ("Изм.", 15),
    ("Лист", 20),
    ("Листов", 20),
    ("№ докум.", 60),
    ("Подп.", 20),
    ("Дата", 25),
    ("Разраб.", 40),
    ("Пров.", 30),
    ("Н.контр.", 30),
    ("Утв.", 30),
    ("Лит.", 15),
    ("Прижим", 30),
]

# Строка с названиями
for text, width_mm in footer_data:
    builder.insert_cell()
    builder.cell_format.width = mm_to_points(width_mm)
    builder.write(text)
builder.end_row()

# Пустая строка
for _, width_mm in footer_data:
    builder.insert_cell()
    builder.cell_format.width = mm_to_points(width_mm)
    builder.write("")
builder.end_row()

builder.end_table()

# Сохраняем
doc.save("spetsifikatsiya_gost_2108.docx")

Нужна помощь. Где что добавить?
  • Вопрос задан
  • 1304 просмотра
Подписаться 3 Простой 12 комментариев
Пригласить эксперта
Ответы на вопрос 1
leahch
@leahch
3D специалист. Dолго, Dорого, Dерьмово.
В общем, все что касается PDF и ГОСТ, это сложно и очень-очень муторно. Я бы все делал в latex. А его генерировал бы из шаблона.

Что касается docx, то его тоже можно генерировать из шаблона. Рекомендую - https://github.com/elapouya/python-docx-template
Лучшего скорее всего ничего не найдете, ну если только на java и clojure - https://github.com/erdos/stencil :)

А еще лучше - налепить шаблонов ГОСТ и сверху по ним печатать, установив правильные отступы на страницы и междустрочный шаг!
И да, типографии сразу продают готовые листы шаблонов по ГОСТ.

ЗЫ. Какой же это гиморрой я вам скажу... Как же хорошо, что я этим больше не занимаюсь!
ЗЫЫ. И да - цифра 68 в ГОСТ 2.108-68 означает год выпуска сего опуса, когда компухтеров и текстовых процессоров и в помине не было!
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы