python docx-mailmerge портит форматирование документа - PullRequest
0 голосов
/ 27 мая 2020

Я использую библиотеку Python docx-mailmerge, которая действительно хорошо заменяет поля слияния. Но когда я начинаю добавлять специальное форматирование к файлу docx, например, отступы, возвращаемая версия документа - это полный беспорядок.

Вот код python, ничего особенного, просто производит беспорядок на изображении ниже (но он отлично работает с базовым c текстовым документом)

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from __future__ import print_function
from mailmerge import MailMerge
from datetime import date
import re
import getopt, sys
import argparse


# build the arguments
argumentParser = argparse.ArgumentParser(description='Process word document merge fields')

# add main arguments
argumentParser.add_argument('--inputDocx', required=True, help='The template docx file')
argumentParser.add_argument('--outputDocx', required=True, help='The output docx file')


# add arguments for the merge fields
argumentParser.add_argument('--valuedPrice', help='Valuation price')
argumentParser.add_argument('--propertyPrice', help='Property price string')
argumentParser.add_argument('--systemDate', help='The system date')
argumentParser.add_argument('--userFullName', help='The full name of the user making the document')
argumentParser.add_argument('--userJobTitle', help='The full job title of the user making the document')
argumentParser.add_argument('--applicantAddress', help='The applicant address')
argumentParser.add_argument('--applicantName', help='The applicant name')
argumentParser.add_argument('--propertyAddress', help='The property address')
argumentParser.add_argument('--eventDate', help='An event date')
argumentParser.add_argument('--eventTime', help='An event time')
argumentParser.add_argument('--attendeeName', help='Usually the negotiator name')
argumentParser.add_argument('--branchTel', help='The branch telephone')
argumentParser.add_argument('--branchEmail', help='The branch email address')
argumentParser.add_argument('--ownerName', help='The property owner name')
argumentParser.add_argument('--ownerAddress', help='The property owner address')
argumentParser.add_argument('--propertyTenure', help='Property Tenure')

# parse the arguments
arguments = argumentParser.parse_args()


# get filename
template = arguments.inputDocx
outputTemplate = arguments.outputDocx

# get values to replace
valuedPrice = arguments.valuedPrice if arguments.valuedPrice != None else ''
propertyPrice = arguments.propertyPrice if arguments.propertyPrice != None else ''
systemDate = arguments.systemDate if arguments.systemDate != None else ''
userFullName = arguments.userFullName if arguments.userFullName != None else ''
userJobTitle = arguments.userJobTitle if arguments.userJobTitle != None else ''
applicantName = arguments.applicantName if arguments.applicantName != None else ''
applicantAddress = arguments.applicantAddress if arguments.applicantAddress != None else ''
propertyAddress = arguments.propertyAddress if arguments.propertyAddress != None else ''
eventDate = arguments.eventDate if arguments.eventDate != None else ''
eventTime = arguments.eventTime if arguments.eventTime != None else ''
attendeeName = arguments.attendeeName if arguments.attendeeName != None else ''
branchTel = arguments.branchTel if arguments.branchTel != None else ''
branchEmail = arguments.branchEmail if arguments.branchEmail != None else ''
ownerName = arguments.ownerName if arguments.ownerName != None else ''
ownerAddress = arguments.ownerAddress if arguments.ownerAddress != None else ''
propertyTenure = arguments.propertyTenure if arguments.propertyTenure != None else ''


# using docx-mailmerge 0.5.0 library

valuedPrice=str(valuedPrice).decode('utf8')
# store field replacements
fieldReplacements = {}
fieldReplacements["event_ValuedPrice"] = valuedPrice
fieldReplacements["property_Price"] = propertyPrice
fieldReplacements["system_Date"] = systemDate
fieldReplacements["pp_Name"] = userFullName
fieldReplacements["pp_JobTitle"] = userJobTitle
fieldReplacements["applicant_GroupName"] = applicantName
fieldReplacements["applicant_Address"] = applicantAddress
fieldReplacements["property_Address"] = propertyAddress
fieldReplacements["event_Date"] = eventDate
fieldReplacements["event_Time"] = eventTime
fieldReplacements["attendee_Name"] = attendeeName
fieldReplacements["branch_Telephone"] = branchTel
fieldReplacements["branch_Email"] = branchEmail
fieldReplacements["owner_GroupName"] = ownerName
fieldReplacements["owner_groupname"] = ownerName
fieldReplacements["owner_Address"] = ownerAddress
fieldReplacements["property_tenure"] = propertyTenure;

# special custom fields
#fieldReplacements["options_withWithoutGuarantee"] = options_withWithoutGuarantee
#fieldReplacements["options_landRegistryTitle"] = options_landRegistryTitle
#fieldReplacements["options_landRegistryTitleNumbers"] = options_landRegistryTitleNumbers



# load the file into merge library
document = MailMerge(template)


# turn merge fields object into a list
fields = list(document.get_merge_fields())

# store the formatted fields
formattedFields = fields

# loop fields
if len(fields) > 0:
    i = 0
    while i < len(fields):

        # replace the [1,0,1,1] bits
        currentVal = re.sub("\[.*\]","",fields[i])
        print("ORIGINAL FIELD: " + fields[i] + " REPLACED: " + currentVal)

        # DOES THE STRIPPED NAME EXIST IN OUR DICTIONARY?
        if currentVal in fieldReplacements:
            # REPLACE ORIGINAL FIELD
            document.merge(
                **{fields[i] : fieldReplacements[currentVal]}
            )

        i += 1



# write the document
document.write(outputTemplate)

Изображение 1 - это оригинал, Изображение 2 - это то, что выдает docx-mailmerge:

enter image description here

enter image description here

...