Spire doc теряет форматирование при конвертации из docx в pdf - PullRequest
0 голосов
/ 31 августа 2018

Я пишу систему, которая изменяет шаблон письма (через OpenXml Wordprocessing) для разных людей, а затем преобразует их в PDF-файлы для печати. Однако при преобразовании в pdf адрес теряет свой интервал переключения с обычной адресной строки

mrs1 Test2 Name2
что
дом
вниз
inr32m

до плоской адресной строки

mrs1 Test2 Name2thousedowninr32m

xml, создаваемый при написании того же слова, -

 <w:r>
    <w:t>Mrs</w:t>
  </w:r>
  <w:r>
    <w:br />
    <w:t>test</w:t>
  </w:r>
  <w:r>
    <w:br />
    <w:t>value</w:t>
  </w:r>
  <w:r>
    <w:br />
    <w:t>for</w:t>
  </w:r>
  <w:r>
    <w:br />
    <w:t>the</w:t>
  </w:r>
  <w:r>
    <w:br />
  </w:r>
</w:p>

И xml из моей выведенной версии -

<w:r>
    <w:t>
      <w:r>
        <w:t> mrs1 Test2 Name2<w:br /></w:t>
      </w:r>
      <w:r>
        <w:t> that<w:br /></w:t>
      </w:r>
      <w:r>
        <w:t> house<w:br /></w:t>
      </w:r>
      <w:r>
        <w:t> down<w:br /></w:t>
      </w:r>
      <w:r>
        <w:t> inr32m<w:br /></w:t>
      </w:r>
    </w:t>
  </w:r>

Мое сгенерированное слово doc и полученный pdf Изображение слова doc и полученный pdf

И вручную написанное слово doc и получившийся pdf Генерированное вручную слово doc и полученный pdf

В настоящее время это преобразование выполняется с помощью 2 основных методов

private void ConvertToPdf()
    {
        try
        {
            for (int i = 0; i < listOfDocx.Count; i++)
            {
                CurrentModalText = "Converting To PDF";
                CurrentLoadingNum += 1;

                string savePath = PdfTempStorage + i + ".pdf";
                listOfPDF.Add(savePath);

                Spire.Doc.Document document = new Spire.Doc.Document(listOfDocx[i], FileFormat.Auto);
                document.SaveToFile(savePath, FileFormat.PDF);
            }

        }
        catch (Exception e)
        {
            throw e;
        }
    }

и

 private string ReplaceAddressBlock(string[] address, string localDocText)
    {
        //This is done to force the array to have 6 indicies (with one potentially being empty
        string[] addressSize = new string[6];
        address.CopyTo(addressSize, 0);
        //defines the new save location of the object

        //add an xml linebreak to each piece of the address
        var addressString ="";
        var counter = 0;
        foreach (var t in address)
        {
            if (counter != 0)
            {
                addressString += "<w:r><w:t> ";
            }

            addressString += t + "<w:br />";
            if (counter != 4)
            {
                addressString += "</w:r></w:t> ";
            }
            counter += 1;

        }

        //look for the triple pipes then replace everything in them and them with the address
        var regExp = @"(\|\|\|).*(\|\|\|)";
        Regex regexText = new Regex(regExp, RegexOptions.Singleline);
        localDocText = regexText.Replace(localDocText, addressString);
        return localDocText;
    }

с localDocText, являющимся копией полных документов xml

Мне нужно, чтобы вывести адрес в нормальном формате, и я не уверен, что может вызвать это

1 Ответ

0 голосов
/ 01 сентября 2018

Использование разрывов строк не работает, пришлось изменить его на стиль абзаца. Спасибо Кевину за предоставленную мне подсказку. Ниже приведен обновленный код для генерации адреса.

        /// <summary>
/// This replaces the address block
/// </summary>
/// <param name="address">The address array </param>
/// <param name="localDocText">the text we want to modify</param>
/// <returns></returns>
private string ReplaceAddressBlock(string[] address, string localDocText)
{
    //This is done to force the array to have 6 indicies (with one potentially being empty
    string[] addressSize = new string[6];
    address.CopyTo(addressSize, 0);
    //defines the new save location of the object

    //add an xml linebreak to each piece of the address
    var addressString ="";
    var counter = 0;
    foreach (var t in address)
    {
        if (counter != 0)
        {
            addressString += " <w:p> <w:r><w:t> ";
        }

        addressString += t ;
        if (counter != 4)
        {
            addressString += "</w:t> </w:r></w:p> ";
        }
        counter += 1;

    }

    //look for the triple pipes then replace everything in them and them with the address
    var regExp = @"(\|\|\|).*(\|\|\|)";
    Regex regexText = new Regex(regExp, RegexOptions.Singleline);
    localDocText = regexText.Replace(localDocText, addressString);
    return localDocText;
}
...