Ошибка при сохранении команды WordXP Delphi в формате PDF

У меня есть приложение, которое отлично работало при сохранении в виде файла .doc. С тех пор я пытался получить его, чтобы программа сохраняла как .doc, так и .pdf, это делается с помощью модуля WordXP.

procedure TDocCreator.CloseDocument(ASaveAs : string);
var
  LFileName : OleVariant;
begin
  LFileName := ASaveAs;
  FDoc.SaveAs(LFileName, EmptyParam,EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
     EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
  LFileName := ChangeFileExt(ASaveAs, '.pdf');
  FDoc.SaveAs(LFileName,PDFFileFormat,EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
     EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam);
  FWordApp.NormalTemplate.Saved := true;
  FWordApp.Quit(True);
  FWordApp.Disconnect;
end; 

Если я удалю второе сохранение, код будет работать нормально. Исключение «Ошибка команды EOleException» не появляется каждый раз при сохранении документа, но момент, в котором происходит разрыв, - это когда SaveAs для файла .pdf.

Обратите внимание, что у меня есть только 2 доступные процедуры сохранения: SaveAs (Используется выше) и SaveAs2000. Также я нахожусь вдали от машины, которая может компилировать delphi.

Если я что-то пропустил или мне нужно что-то прояснить, я смогу ответить, однако я не смогу протестировать какие-либо изменения кода до вторника.

Спасибо.

Изменить: Хорошо, программа удаленно отлаживается (машина, которая выполняет весь код, не имеет доступа к офису, поскольку она находится на виртуальной машине). Приложение проходит через набор шаблонов, которые объединяются по почте, после чего начинается процесс сохранения. Итак, я сделал 2 документа (этот процесс выполняется в цикле for). Это сработало. Затем я попытался сделать 5 для третьего файла, он вызвал ошибку «Ошибка команды». Что затем не закрывает слово и отменяет оставшийся процесс. При просмотре LFileName его содержимое было «???». Иногда это иноземные персонажи. Хотя ему все еще удается создать файл .doc с правильным файловым форматом. Это имя файла устанавливается вне процедуры, если это имеет значение - «ASaveAs». Другое дело, что файл не открывается никакими другими приложениями. Он выполняет весь процесс, используя слово «приложение», которое открывает программа.


person Edward    schedule 03.04.2015    source источник
comment
Как определяется PDFFileFormat? Какая версия Word установлена?   -  person David Heffernan    schedule 03.04.2015
comment
@DavidHeffernan PDFFileFormat - это константа, для которой установлено значение 17. Word 2010, однако для меня я не могу гарантировать, какая версия слова будет использоваться, я думаю, что это будет 2010 год для всех, кто использует приложение, но я не уверен на 100%.   -  person Edward    schedule 03.04.2015
comment
Он основан на надстройке для Office 97. Узнайте, какая версия работает в случае сбоя.   -  person David Heffernan    schedule 03.04.2015
comment
Никто, использующий приложение, не будет использовать Office 97. Самая ранняя версия - 2007. Но, возвращаясь к вопросу, это Office 2010, который дает сбой.   -  person Edward    schedule 03.04.2015
comment
О, что я говорю? Office 2007 я имел в виду не 97.   -  person David Heffernan    schedule 03.04.2015
comment
Какое дополнение потребовалось бы из любопытства? В случае, если мне нужно убедиться, что другие системы могут запускать приложение, если они не работают с Office 2010?   -  person Edward    schedule 03.04.2015
comment
Сохранение в формате pdf. Необязательный для 2007 года, после этого встроен.   -  person David Heffernan    schedule 03.04.2015
comment
Я дважды проверю, какая версия офиса будет работать, и, если они используют 2007, я проверю, что надстройка установлена. Однако ошибка «Ошибка команды» все равно будет появляться, я думаю, поскольку система, которую я использую для тестирования программы, работает под управлением Office 2010.   -  person Edward    schedule 05.04.2015
comment
PDF-файл открыт в другой программе?   -  person David Heffernan    schedule 05.04.2015
comment
Не совсем уверен, что вы имеете в виду. Открывается файл .doc, в котором происходят некоторые замены текста. Затем этот файл пытается сохранить как файлы .doc и .pdf. По умолчанию он открывается в другой программе, но он также открывается в слове «ЕСЛИ» файл сохраняет.   -  person Edward    schedule 05.04.2015
comment
Файл может быть заблокирован, если он открыт другим процессом (например, программой просмотра PDF-файлов). В любом случае, я думаю, вам может потребоваться более качественная диагностика.   -  person David Heffernan    schedule 05.04.2015
comment
Какая-то форма изменения удачи ... Я добавил «Sleep (1000)» перед сохранением pdf, и мне удалось сохранить 5 документов, а затем 7, попробую несколько более крупных. Если это решит проблему, я не знаю, почему я хотел бы получить объяснение по этому поводу. Вернусь сюда, как только закончу более крупные сейвы. Изменить: говорил, что вскоре это случилось снова. по варианту из 7 документов, однако это был последний документ, который нужно было заполнить.   -  person Edward    schedule 07.04.2015
comment
Увеличен таймер сна до 2000 мс, и с тех пор не возникало ошибки Command Failed. Отправлено до 10 документов на рассылку, и кажется, что они ушли в архив. Это может быть похоже на то, как заявил @DavidHeffernan, слово, вероятно, не закончило сохранение файла .doc, прежде чем перейти к файлу .pdf. Хотя я не могу сказать наверняка, как и раньше, я сделаю больше тестов, но это кажется немного более надежным, если не сказать больше.   -  person Edward    schedule 07.04.2015


Ответы (1)


  LFileName := ASaveAs;
  try
    try
      FDoc.SaveAs(LFileName,EmptyParam, EmptyParam, EmptyParam, ...);
    except
      on E : Exception do
        ShowMessage(E.ClassName + ' error creating document');
    end;
    try
      if FileExists(LFileName) then
      begin
        Sleep(5000);
        LFileName := ChangeFileExt(ASaveAs, '.pdf');
        FDoc.SaveAs(LFileName,PDFFileFormat,EmptyParam, EmptyParam, ...;
      end;
    except
      on E : Exception do
        ShowMessage(E.ClassName + ' error creating PDF');
    end;
  finally
    FWordApp.Quit(True);
    FWordApp.Disconnect;
  end;

Могло быть лучше, и я все еще не уверен в том, что попробую, кроме того, но он работает без сбоев благодаря тактическому сну. Могло бы быть лучше, и я бы хотел, чтобы это было, но пока это кажется нормальным решением. Спасибо Дэвиду Хеффернану за указание на то, что файл, вероятно, использовался.

person Edward    schedule 17.04.2015