У меня возникла внезапная проблема, которую я, кажется, не могу понять. В моем приложении ASP.NET MVC 5 (.NET Framework 4.8), работающем в IIS в Windows 10 (dev) и Windows Server 2019 (prod), у меня был следующий код для создания PDF-файлов из HTML, обработанных на сервере и сохраненных как файл с помощью Google Chrome.
Process.Start("cmd.exe", "/C \"\"C:/Program Files/Google/Chrome/Application/chrome.exe\" --headless --disable-gpu --run-all-compositor-stages-before-draw --no-margins --no-pdf-header-footer --print-to-pdf=E:\\Chrome-Print-to-PDF\\e24cfc08-f91f-46ec-82be-85f49f1178f6.pdf E:\\Chrome-Print-to-PDF\\e24cfc08-f91f-46ec-82be-85f49f1178f6.html\"");
Это работает уже 2, а может и 3 года. Это сработало вчера. На сегодняшний день он необъяснимым образом выходит из строя без каких-либо ошибок. Он просто не генерирует PDF-файл. Папка Chrome-Print-to-PDF
на обеих машинах имеет Everyone
с полными разрешениями, поэтому я не думаю, что это проблема с разрешениями.
Запуск этого кода в LINQPad 5 создаст PDF-файл, как и ожидалось.
Запуск такой команды в командной строке также работает:
CMD.EXE /C ""C:/Program Files/Google/Chrome/Application/chrome.exe" --headless --disable-gpu --run-all-compositor-stages-before-draw --no-margins --no-pdf-header-footer --print-to-pdf=E:\Chrome-Print-to-PDF\e24cfc08-f91f-46ec-82be-85f49f1178f6.pdf E:\Chrome-Print-to-PDF\e24cfc08-f91f-46ec-82be-85f49f1178f6.html"
Или вот так, также в командной строке работает:
CMD.EXE "C:/Program Files/Google/Chrome/Application/chrome.exe" --headless --disable-gpu --run-all-compositor-stages-before-draw --no-margins --no-pdf-header-footer --print-to-pdf=E:\Chrome-Print-to-PDF\e24cfc08-f91f-46ec-82be-85f49f1178f6.pdf E:\Chrome-Print-to-PDF\e24cfc08-f91f-46ec-82be-85f49f1178f6.html
Я совершенно не понимаю, что делать, чтобы решить эту проблему в моем приложении ASP.NET MVC 5, работающем в IIS. Я отчаянно ищу любую помощь, потому что это заблокировало мое приложение для создания каких-либо PDF-файлов, и меня преследуют многие пользователи.
Пробовали ли вы не использовать cmd.exe (т. е. cmd.exe/c)?
Почему вы используете cmd.exe
, чтобы открыть chrome.exe
, почему бы не открыть chrome.exe
напрямую?
Я решил опубликовать ответ, чтобы иметь возможность ответить всем в комментариях.
Что случилось с комментариями @KJ? Информация была полезной, и ссылки на другие вопросы SO по этому поводу могли бы быть полезны для других.
Комментарии и ссылки от @KJ помогли мне найти решение. И чтобы ответить @KJ, да, он обновился до 128. Команда изменилась на:
Process.Start("cmd.exe", "/C \"\"C:/Program Files/Google/Chrome/Application/chrome.exe\" --headless=old --run-all-compositor-stages-before-draw --no-pdf-header-footer --print-to-pdf=E:\\Chrome-Print-to-PDF\\e24cfc08-f91f-46ec-82be-85f49f1178f6.pdf E:\\Chrome-Print-to-PDF\\e24cfc08-f91f-46ec-82be-85f49f1178f6.html\"");
Теперь это работает. Проблема в том --headless=old
. В конце концов старая версия будет удалена, но я не могу заставить работать и новую версию, так что, похоже, в свое время мы вернемся к SO для решения этой проблемы. Надеемся, что ошибки, связанные с этим адресом, позволят нам использовать новую версию так же, как и старую.
@ItAllMakesSense, я видел этот ответ и реализовал его, чтобы увидеть результат, но это не особо помогло.
@Charlieface, ты меня понял, думаю, в то время я просто назвал это хорошим и пошел дальше, сколько бы времени мне ни потребовалось, чтобы заставить его работать. При этом вы правы, и я обновил команду, чтобы использовать Chrome напрямую, а не через CMD:
Process.Start("C:/Program Files/Google/Chrome/Application/chrome.exe", "--headless=old --run-all-compositor-stages-before-draw --no-pdf-header-footer --print-to-pdf=E:\\Chrome-Print-to-PDF\\e24cfc08-f91f-46ec-82be-85f49f1178f6.pdf E:\\Chrome-Print-to-PDF\\e24cfc08-f91f-46ec-82be-85f49f1178f6.html");
Спасибо всем за помощь! До новых встреч, когда --headless=old
перестанет работать!
В путях Windows следует использовать \
, а не /
.
Это правда, я забыл это изменить теперь, когда CMD
исчез из поля зрения. Хотя, когда я проверял, это работало.
Следующий пост может быть интересен: stackoverflow.com/a/66787416/10024425 — там показано, как перенаправить StandardOutput и StandardError в файл при использовании cmd.exe.