Как превратить страницу ColdFusion в загружаемый PDF-файл?

StackOverflow https://stackoverflow.com/questions/73964

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top