ColdFusion: создание PDF из нескольких больших двоичных объектов PDF

У меня есть несколько PDF-файлов, хранящихся в моей базе данных в виде больших двоичных объектов, и мне нужно объединить их, чтобы создать один PDF-файл, который необходимо передать пользователю.

Я понимаю, что это довольно легко сделать, если я визуализирую один PDF-файл из большого двоичного объекта, но я не могу понять, как объединить несколько больших двоичных объектов.

<cfheader name="Content-Disposition" value="inline; filename=#document.name#.#document.ext#">
<cfcontent type="application/pdf" variable="#document.content#">

Я вижу, что CFPDF помогает с этой функциональностью, но, похоже, не может поместить мой большой двоичный объект в переменную cfpdf. Подобный вопрос задавался здесь раньше, но у него нет ответа I искать.

Спасибо!


person Helius 06    schedule 28.07.2014    source источник
comment
Также попробовал stackoverflow .com/questions/10690548/, но получаю сообщение об ошибке: Произошла ошибка во время операции EXTRACTTEXT в теге cfpdf. Ошибка: недействительный документ. Проверьте исходный код или файлы в каталоге.   -  person Helius 06    schedule 28.07.2014


Ответы (2)


Попробуйте преобразовать данные большого двоичного объекта в файл (в памяти, используя ram://, если это возможно, чтобы сохранить запись на диск), а затем используйте его в качестве источника слияния cfpdf. Вы можете сделать это для каждого большого двоичного объекта, когда вы зацикливаете свой запрос в теге cfpdf action="merge":

<cfquery name="q" datasource="test">
  SELECT content FROM pdfs
</cfquery>

<cfpdf action="merge" name="mergedPdf">
  <cfloop query="q">
    <cfset tempBinary=q.content><!---intermediate var seems to be necessary in some environments --->
    <cffile action="write" output="#tempBinary#" file="ram://temp.pdf">
    <cfpdfparam source="ram://temp.pdf">
  </cfloop> 
</cfpdf>
<cfcontent type="application/pdf" variable="#ToBinary( mergedPdf )#" reset="true">

Обратите внимание, что вы можете использовать один временный файл — не нужно создавать отдельный файл для каждого большого двоичного объекта в запросе.

person CfSimplicity    schedule 01.08.2014
comment
CfSimplecity, Спасибо за этот ответ. Мне пришлось вернуться к этому через некоторое время, и я понял, что не решил эту проблему. Ваш метод сработал, за исключением небольшой поправки. Я отредактировал код, чтобы включить обновление. - person Helius 06; 10.10.2014
comment
Рад помочь. Мой исходный код работает на CF9.0.1 без промежуточной переменной для q.content. Какую версию CF вы используете? - person CfSimplicity; 10.10.2014
comment
У меня тоже cf 9.0.1. Я получал ошибку во время MERGE без промежуточной переменной. - person Helius 06; 10.10.2014
comment
Странный. Возможно разница в хотфиксах. В любом случае промежуточная переменная также работает в моей среде, поэтому я изменил свой код на случай, если у других возникнет такая же проблема. - person CfSimplicity; 10.10.2014

Я думаю, вы можете сделать следующее

Извлеките каждый BLOB-объект PDF, хранящийся в БД, и создайте PDF-файл с помощью cfpdf и сохраните их в каком-либо временном каталоге.

  <cfpdf action="write" destination="c:\pdfs\1.pdf" source="#mypdfblob1" >

Извлеките все такие BLOB-объекты и сохраните их в виде pdf-файлов во временном каталоге.

Объедините все эти PDF-файлы, используя cfpdf merge, указав временный каталог в cfpdf merge.

<cfpdf action="merge" directory="C:\pdfs" destination="C:\result.pdf">
person Dungeon Hunter    schedule 28.07.2014
comment
Попытка записи cfpdf приводит к тому, что объекты ByteArray не могут быть преобразованы в строки. - person Helius 06; 28.07.2014
comment
вы можете предоставить немного трассировки стека - person Dungeon Hunter; 28.07.2014
comment
И добавление ToString к большому двоичному объекту также не помогло. - person Helius 06; 28.07.2014
comment
попробуйте сбросить переменную #document.content# - person Dungeon Hunter; 28.07.2014
comment
Да, это отлично сбрасывает двоичный объект запроса. Кстати, пытаюсь посмотреть, смогу ли я прикрепить stacktrace. - person Helius 06; 28.07.2014
comment
использование tostring также не помогло, похоже, проблема с кодировкой. Какую кодировку вы использовали при создании BLOB-объекта с содержимым PDF. - person Dungeon Hunter; 28.07.2014