Есть идеи, почему PDF-файл python comclient (из документа word, созданного python docx ) неправильно помечает заголовки таблиц?

#pdf #com #python-docx

Вопрос:

каждый год мне приходится создавать множество PDF — файлов, соответствующих требованиям ADA (Закон об американцах с ограниченными возможностями), с длинными таблицами-одна таблица занимает много страниц.

Данные для таблиц находятся в текстовых файлах. Сначала я использую python Docx для создания документов Word из таблиц, которые правильно расположены, отформатированы и содержат метаданные, такие как название, автор и т. Д.

Пока все хорошо. Если я проведу предварительную проверку, открыв документ Word и используя расширение Acrobat, встроенное в Word, для создания PDF-файла, заголовок таблицы будет точно помечен при запуске программы проверки специальных возможностей Adobe.

Но я не хочу вручную создавать каждый PDF-файл, поэтому затем я использую python Comclient для создания PDF-файлов из документов Word. Все выглядит хорошо, за исключением того, что я получаю ошибку, когда запускаю проверку доступности, в которой говорится, что заголовки таблиц не удалось.

Если я посмотрю на теги PDF, в первой строке таблицы будет тег со словом Path, повторяющимся снова и снова, PathPathPathPathPathPathPathPathPathPathPathPathPath. После тега Span заголовки таблиц правильно помечены как . Теги PDF плохие

Этот тег Span отсутствует в PDF-файлах, созданных из одного и того же документа с использованием расширения Acrobat, встроенного в Word, поэтому я предполагаю, что это причина сбоя заголовка при создании PDF с использованием кода python comclient.

Теги PDF хороши

Any ideas on what might be causing this Span tag and/or how to stop it?

Possibly relevant docx code used to make headers:

 from docx import Document
from docx.shared import Cm, Pt, Inches
from docx.oxml import OxmlElement
from docx.oxml.shared import OxmlElement
from docx.oxml.ns import qn
import docx
import os
import sys
import comtypes.client
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_ALIGN_VERTICAL
   
--function from github raphaelvalentin , much appreciated!
     def set_repeat_table_header(row):
            """ set repeat table row on every new page
            """
            tr = row._tr
            trPr = tr.get_or_add_trPr()
            tblHeader = OxmlElement('w:tblHeader')
            tblHeader.set(qn('w:val'), "true")
            trPr.append(tblHeader)
            return row

--function from github AlbinoShadow, much appreciated: 
    def prevent_document_break(document):#keeps table rows from splitting in half over a page break
        """https://github.com/python-openxml/python-docx/issues/245#event-621236139
           Globally prevent table cells from splitting across pages.
        """
        tags = document.element.xpath('//w:tr')
        rows = len(tags)
        for row in range(0, rows):
            tag = tags[row]  # Specify which <w:r> tag you want
            child = OxmlElement('w:cantSplit')  # Create arbitrary tag
            tag.append(child)  # Append in the new tag

doc = docx.Document()
cp = doc.core_properties
cp.author  = name #name defined previously
cp.title = title #title defined previously
table = doc.add_table(rows= row_ttl, cols= col_ttl)
table.autofit = False 
table.allow_autofit = False
table.style='Light Grid Accent 1'
set_repeat_table_header(table.rows[0])
 

Возможно, соответствующий код comclient, используемый для создания PDF-файлов

            pdf_name = file[:-3] 'pdf'
            prevent_document_break(doc)
            doc.save(ada_pdfs_folder fldr '/word_docs/'   file_name)
            wdFormatPDF = 17
            in_file = ada_pdfs_folder fldr '/word_docs/'   file_name
            out_file =ada_pdfs_folder fldr '/'   pdf_name
            word = comtypes.client.CreateObject('Word.Application')
            doc2 = word.Documents.Open(in_file)
            doc2.SaveAs(out_file, FileFormat=wdFormatPDF)
            doc2.Close()
            word.Quit()
 

Спасибо за любые мысли или предложения
-Кимберли

Комментарии:

1. Это могут быть повторяющиеся заголовки таблиц с одним и тем же xpath, которые находятся на разных страницах.

2. Используйте print(table._tbl.xml) для проверки XML таблицы, которая работает, и таблицы, которая не работает, и посмотрите, сможете ли вы определить разницу, которая может объяснить такое поведение.