Как превратить страницу ColdFusion в PDF файл?

Я хотел бы повернуть HTML, сгенерированный моей CFM-страницей, в PDF файл и запросить у пользователя стандартную подсказку "Сохранить как" при переходе на мою страницу.

Ответы

Ответ 1

Вы должны использовать тег cfdocument (с форматом = "PDF" ) для создания PDF файла, разместив его вокруг создаваемой страницы. Вам нужно указать атрибут имени файла, иначе документ будет просто передаваться прямо в ваш браузер.

После сохранения содержимого в формате PDF используйте cfheader и cfcontent в комбинации для вывода PDF в виде вложения ( "Сохранить как" ) и добавьте файл в поток ответов. Я также добавил deletefile = "Да" в теге 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 для имени файла в приведенном ниже примере, но вы можете захотеть использовать произвольную или сгенерированную сессией строку для имени файла, чтобы избежать проблем, связанных с условиями гонки.

Ответ 2

Если вы хотите вообще не хранить PDF файл, использование cfdocument без имени файла отправит pdf (флэш-документ) прямо в браузер без использования cfheader и cfcontent.

Предостережение. Как и при использовании cfheader/cfcontent, вам нужно сделать это до того, как кеш будет очищен от браузера, поскольку он в основном делает то же самое, не сохраняя файл.

Чтобы получить контент, я бы, вероятно, использовал cfsavecontent, обернутый вокруг тех же вызовов/включая/etc. которые генерируют страницу с двумя основными исключениями. cfdocument, похоже, имеет проблемы с внешними таблицами стилей, поэтому использование include для размещения стилей непосредственно в документе, вероятно, является хорошей идеей. Вместо этого вы можете попробовать использовать @import - это работает для некоторых людей. Кроме того, я буду осторожен относительно относительных связей с изображениями, поскольку они могут иногда ломаться.

Ответ 3

Подход <cfdocument> - это санкционированный способ сделать это, однако он не предлагает все возможное, чтобы манипулировать существующими документами PDF. У меня был проект, где мне нужно было создавать купоны на основе предварительно разработанного PDF-шаблона с разрешением на печать. <cfdocument> позволил бы мне приблизиться к выходу, но только с растровыми изображениями, встроенными в HTML. Правда, я мог подделать разрешение печати, сделав большое изображение и масштабируя его в HTML, но оригинал был красивым, чистым файлом векторного изображения, и я хотел использовать его вместо этого.

В итоге я использовал копию <cfx_pdf>, чтобы выполнить задание. (Сайт разработчика, Магазин тегов CF) Это CF-оболочку вокруг библиотеки Java PDF, которая позволяет вам манипулировать существующими документами PDF, включая заполнение форм PDF, установку разрешений, слияние файлов, рисование векторной графики, таблиц и текста, использование пользовательских шрифтов и т.д. И т.д. Если вы готовы работать с его помощью вы можете получить довольно эффектные результаты.

Единственным недостатком является то, что разработчик оставил этот продукт на пастбище в течение длительного времени. Сайт разработчика по-прежнему является авторским правом 2003 года и не упоминает ничего о ColdFusion MX 6.1. В итоге мне пришлось сломать некоторые зашифрованные шаблоны, чтобы исправить пару ошибок и заставить их работать так, как мне было нужно. Тем не менее, это мощный инструмент.

Ответ 4

Я не знаком с ColdFusion, но вам нужно установить Content-Type страницы, когда пользователь запросит его как приложение/октет-поток. Это будет запрашивать их для загрузки каждый раз.

Надеюсь, это поможет!