Как превратить страницу ColdFusion в загрузку в формате PDF? - PullRequest
13 голосов
/ 16 сентября 2008

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

Ответы [ 4 ]

17 голосов
/ 16 сентября 2008

Вы должны использовать тег cfdocument (с format = "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 для имени файла в приведенном ниже примере, но вы можете использовать некоторую случайную или сгенерированную сессию строку для имени файла, чтобы избежать проблем, возникающих из-за условий гонки.

4 голосов
/ 16 сентября 2008

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

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

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

3 голосов
/ 18 сентября 2008

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

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

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

1 голос
/ 16 сентября 2008

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...