2014-12-04 71 views
6

我试图使用ColdFusion设置PDF的版权元数据& iText。 Adobe ColdFusion 9-11允许设置标题,主题,关键字,作者&作者字段,但似乎不允许访问“其他元数据”属性。 (这是我的第一个SO问题。)如何使用ColdFusion(&iText)设置PDF版权元数据

我发现了一个潜在的iTextSharp/C#解决方案并试图将其转换为CFML,但是我一直无法确定如何成功访问System.IO.MemoryStream() W/ColdFusion的。我得到一个“找不到ColdFusion组件或接口MemoryStream,确保名称是正确的,并且组件或接口存在。”错误和搜索互联网不提供任何结果。

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

注:我使用iText的,因为PDF文件使用ABBYY FineReader生成。过去我遇到过很多问题,在使用isPDFFile()时,ColdFusion拒绝将非Acrobat生成的PDF识别为有效的PDF。

任何想法?功能目前是否存在,并且没有记录在任何地方?谢谢。

回答

5

(太长的评论...)

正如Ryan提到的,它可能使用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”,更新这些附加元数据字段似乎不起作用。谢谢! – 2014-12-05 00:20:58

+0

iText在几年前经历了一次[重大许可改变](https://en.wikipedia.org/wiki/IText#History)。 ColdFusion与其中一个较旧的版本捆绑在一起,由“com.lowagie。*”包表示。新版本,即5.x使用“com.itextpdf。*”。由于CF不使用较新版本,所以它不起作用。 – Leigh 2014-12-05 02:28:24

+0

*看起来甚至没有必要*不,它是必需的。它被用于在将xmp元数据添加到pdf之前存储它。在上面的例子中,我使用了'ByteArrayOutputStream'而不是'MemoryStream'。 – Leigh 2014-12-05 17:26:47

1

您可以使用DDX功能来完成此操作。请参阅以下链接:

System.IO.MemoryStream是一个C#类。您将无法直接从CFML访问它。您可以尝试直接使用.net integration features来访问它或iTextSharp解决方案。

+0

关于本文,“DDX语言元素部分”为“404未找到”。 http://livedocs.adobe.com/livecycle/es/sdkHelp/programmer/sdkHelp/ddxRefMain.150.1.html – 2014-12-04 20:19:09

+0

在CFML参考链接中,提到了“ColdFusion 11受限制的DDX元素”,但该页面需要登录。登录后,会显示“不允许”消息。 https://wikidocs.adobe.com/wiki/pages/editpage.action?pageId=87505187#cfpdf-RestrictedDDXelements – 2014-12-04 20:20:24

+0

@JamesMoberg - 查看[常规文档](https://wikidocs.adobe.com/wiki/)显示/ coldfusionen/cfpdf)。不知道你从哪里得到最后一个链接。它用于*修改wiki,我怀疑你是否被授权,这解释了权限错误。我没有使用它,但是cfpdf文档声称支持'Metadata'元素。另请参见[(PDF) - 汇编器服务和DDX参考 - Adob​​e Systems](http://help.adobe.com/zh_CN/livecycle/9.0/ddxRef.pdf) – Leigh 2014-12-04 23:00:13