Я хотел бы преобразовать HTML-код, сгенерированный моей страницей CFM, в PDF-файл, и чтобы пользователю было предложено стандартное приглашение «Сохранить как» при переходе на мою страницу.
Как превратить страницу ColdFusion в загружаемый PDF-файл?
Ответы (4)
Вы должны использовать тег cfdocument (с форматом = "PDF") для создания PDF-файла, поместив его вокруг страницы, которую вы создаете. Вы захотите указать атрибут имени файла, иначе документ будет просто передаваться прямо в ваш браузер.
После того как вы сохранили содержимое в виде PDF-файла, используйте комбинацию cfheader и cfcontent, чтобы вывести PDF-файл в виде вложения («Сохранить как») и добавить файл в поток ответов. Я также добавил deletefile="Yes" в тег cfcontent, чтобы сохранить файловую систему в чистоте.
<cfdocument format="PDF" filename="file.pdf" overwrite="Yes">
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World
</body>
</html>
</cfdocument>
<cfheader name="Content-Disposition" value="attachment;filename=file.pdf">
<cfcontent type="application/octet-stream" file="#expandPath('.')#\file.pdf" deletefile="Yes">
В качестве отступления: я просто использую file.pdf для имени файла в приведенном ниже примере, но вы можете использовать некоторую случайную или сгенерированную сеансом строку для имени файла, чтобы избежать проблем, связанных с условиями гонки.
Если вы хотите вообще избежать сохранения PDF-файла, использование cfdocument без имени файла приведет к отправке PDF-файла (flashpaper) непосредственно в браузер без использования cfheader и cfcontent.
Предупреждение: Как и в случае использования cfheader/cfcontent, вам нужно сделать это до того, как кеш будет сброшен в браузер, поскольку в основном он делает то же самое без необходимости сохранять файл.
Чтобы получить контент, я бы, вероятно, использовал cfsavecontent, обернутый вокруг тех же вызовов/включений/и т. д. которые генерируют страницу, за двумя основными исключениями. У cfdocument, похоже, есть проблемы с внешними таблицами стилей, поэтому использование включения для помещения стилей непосредственно в документ, вероятно, является хорошей идеей. Вместо этого вы можете попробовать использовать @import — это работает для некоторых людей. Кроме того, я был бы осторожен с относительными ссылками на изображения, так как они иногда могут ломаться.
Подход <cfdocument> является санкционированным способом сделать это, однако он не предлагает всех возможных способов манипулирования существующими PDF-документами. У меня был проект, в котором мне нужно было создать купоны на основе предварительно разработанного шаблона PDF с разрешением для печати. <cfdocument> позволил бы мне приблизить вывод, но только с растровыми изображениями, встроенными в HTML. Правда, я мог сымитировать разрешение печати, сделав большое изображение и масштабировав его в HTML, но оригинал был красивым, чистым файлом векторного изображения, и я хотел использовать его вместо этого.
В итоге я использовал копию <cfx_pdf>, чтобы выполнить работу. (Сайт разработчика, CF Tag Store) Это оболочка CF для библиотеки Java PDF, которая позволяет вам манипулировать существующими PDF-документами, включая заполнение PDF-форм, настройку разрешений, объединение файлов, рисование векторной графики, таблицы и текст, использовать пользовательские шрифты и т. д. и т. д. Если вы готовы работать с этим, вы можете получить довольно впечатляющие результаты.
Единственным недостатком является то, что, похоже, разработчик долгое время не использовал этот продукт. Сайт разработчика по-прежнему защищен авторским правом 2003 года и не упоминает ничего, кроме ColdFusion MX 6.1. В итоге мне пришлось сломать некоторые из зашифрованных шаблонов, чтобы исправить пару ошибок и заставить его работать так, как мне нужно. Тем не менее, это мощный инструмент.
Я не очень хорошо знаком с ColdFusion, но вам нужно установить Content-Type страницы, когда пользователь запрашивает, чтобы она была application/octet-stream. Это будет предлагать им загрузку каждый раз.
Надеюсь это поможет!