2014-12-04 6 views
6

Я пытаюсь установить метаданные авторского права в формате PDF с использованием ColdFusion & iText. Adobe ColdFusion 9-11 позволяет получать &, задавая поля Title, Subject, Keywords, Creator & Авторские поля, но не разрешает доступ к свойствам «Дополнительные метаданные». (Это мой первый вопрос SO.)Как установить метаданные в формате PDF с использованием ColdFusion (& iText)

Я нашел потенциальное решение iTextSharp/C# и попытался преобразовать его в CFML, но я не смог определить, как успешно получить доступ к System.IO.MemoryStream() ж/ColdFusion. Я получаю «Не могу найти компонент ColdFusion или интерфейс MemoryStream. Убедитесь, что имя верное и что компонент или интерфейс существует». ошибка и поиск в Интернете не дают никаких результатов.

https://stackoverflow.com/a/6942531/693068

Примечание: Я использую IText, потому что PDF-файлы создаются с помощью ABBYY FineReader. В прошлом я столкнулся с многочисленными проблемами, когда ColdFusion отказывается идентифицировать PDF-файлы, созданные без Acrobat, в качестве достоверных PDF-файлов при использовании isPDFFile().

Любые идеи? Существует ли в настоящее время функциональность и где-то не документировано? Благодарю.

ответ

5

(слишком долго для комментариев ...)

Как уже упоминалось Райан, можно было бы с помощью DDX. В документации на cfpdf перечислены Metadata в качестве поддерживаемого элемента. Поэтому вы можете сначала изучить этот вариант.

Я нашел потенциального iTextSharp/C# решение

Это сказал, что нет необходимости использовать внешнюю C# библиотеки. CF уже связан со старой версией iText (написанной в java). Поэтому используйте классы java. iTextSharp - это порт исходной библиотеки java, поэтому имена классов и методов обычно будут одинаковыми.

source = "c:/path/to/input.pdf"; 
target = "c:/path/to/output.pdf"; 
reader = createObject("java", "com.lowagie.text.pdf.PdfReader").init(source); 
output = createObject("java", "java.io.FileOutputStream").init(target); 
stamper = createObject("java", "com.lowagie.text.pdf.PdfStamper").init(reader, output); 

copyrightName = "YOUR NAME HERE"; 
copyrightUrl = "http://www.example.com/"; 

baos = createObject("java", "java.io.ByteArrayOutputStream").init(); 
xmp = createObject("java", "com.lowagie.text.xml.xmp.XmpWriter").init(baos); 
xmp.addRdfDescription("xmlns:dc=""http://purl.org/dc/elements/1.1/""", "<dc:rights><rdf:Alt><rdf:li xml:lang=""x-default"">"& copyrightName &"</rdf:li></rdf:Alt></dc:rights>"); 
xmp.addRdfDescription("xmlns:xmpRights=""http://ns.adobe.com/xap/1.0/rights/""" 
         , "<xmpRights:Marked>True</xmpRights:Marked><xmpRights:WebStatement>"& copyrightUrl &"</xmpRights:WebStatement>"); 
xmp.close(); 
stamper.setXmpMetadata(baos.toByteArray()); 
stamper.close();  
+0

Это работает! (Использование iText намного проще, чем использование метода DDX.) Я пытался определить, что такое MemoryStream(), как оно связано со сценарием и есть ли альтернатива CF/Java. Похоже, это было даже не нужно. Я также использовал «itextpdf» вместо «lowagie». Обновление этих дополнительных полей метаданных не работает, если используется «itextpdf». Благодаря! –

+0

iText претерпела [значительное изменение лицензии несколько лет назад] (https://en.wikipedia.org/wiki/IText#History). ColdFusion поставляется с одной из старых версий, которые обозначаются пакетом «com.lowagie. *». Новые версии, т.е. 5.x, используют «com.itxtpdf. *». Поскольку CF не использует более новую версию, поэтому она не работает. – Leigh

+0

* похоже, что он даже не нужен * Нет, это необходимо. Он используется для хранения метаданных xmp до их добавления в pdf. В приведенном выше примере я использовал 'ByteArrayOutputStream' вместо' MemoryStream'. – Leigh

1

Возможно, вы сможете сделать это с помощью возможностей DDX. Смотрите следующие ссылки:

System.IO.MemoryStream является C# класс. Вы не сможете получить к нему доступ напрямую из CFML. Вы можете попытаться использовать .net integration features для доступа к нему или к решению iTextSharp напрямую.

+0

Что касается статьи, раздел «Элементы языка DDX» - «404 Not Found». http://livedocs.adobe.com/livecycle/es/sdkHelp/programmer/sdkHelp/ddxRefMain.150.1.html –

+0

В ссылке ссылки CFML есть ссылка на «ColdFusion 11 ограниченные элементы DDX», но для этой страницы требуется вход в систему. После входа в систему отображается сообщение «Не разрешено». https://wikidocs.adobe.com/wiki/pages/editpage.action?pageId=87505187#cfpdf-RestrictedDDXelements –

+0

@JamesMoberg - посмотрите в [обычные документы] (https://wikidocs.adobe.com/wiki/ дисплей/coldfusionen/cfpdf). Не знаете, где вы получили эту последнюю ссылку. Это для * модификации * вики, в котором я сомневаюсь, что вы авторизованы, что объясняет ошибку разрешений. Я не использовал его, но документы cfpdf говорят, что поддерживается элемент «Метаданные».См. Также [(PDF) - Assembler Service и DDX Reference - Adobe Systems] (http://help.adobe.com/en_US/livecycle/9.0/ddxRef.pdf) – Leigh

Смежные вопросы