【问题标题】:How to set PDF copyright metadata using ColdFusion (&iText)如何使用 ColdFusion (&iText) 设置 PDF 版权元数据
【发布时间】:2015-02-02 20:09:35
【问题描述】:

我正在尝试使用 ColdFusion 和 iText 设置 PDF 的版权元数据。 Adobe ColdFusion 9-11 允许获取和设置标题、主题、关键字、创建者和作者字段,但似乎不允许访问“附加元数据”属性。 (这是我的第一个 SO 问题。)

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

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

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

有什么想法吗?该功能当前是否存在,只是没有记录在任何地方?谢谢。

【问题讨论】:

    标签: pdf coldfusion itext


    【解决方案1】:

    (对于 cmets 来说太长了...)

    正如 Ryan 提到的,使用 DDX 可能是可能的。 cfpdf 文档将 Metadata 列为受支持的元素。因此,您可能需要先研究该选项。

    我找到了一个潜在的 iTextSharp/C# 解决方案

    也就是说,没有必要使用外部 C# 库。 CF 已经与旧版本的 iText(用 java 编写)捆绑在一起。所以改用java类。 iTextSharp是原java库的一个port,所以类名和方法名通常是一样的。

    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();    
    

    【讨论】:

    • 这行得通! (使用 iText 比使用 DDX 方法容易得多。)我试图确定 MemoryStream() 是什么,它与脚本的关系以及是否有 CF/Java 替代方案。看起来甚至没有必要。我也在使用“itextpdf”而不是“lowagie”。如果使用“itextpdf”,更新这些额外的元数据字段似乎不起作用。谢谢!
    • iText 接受了significant license change a few years back。 ColdFusion 与旧版本之一捆绑在一起,由包“com.lowagie.*”表示。较新的版本,即 5.x 使用“com.itextpdf.*”。由于 CF 不使用较新的版本,这就是它不起作用的原因。
    • 看起来甚至没有必要不,它是必需的。它用于在将 xmp 元数据添加到 pdf 之前存储它。在上面的示例中,我使用了ByteArrayOutputStream 而不是MemoryStream
    【解决方案2】:

    您也许可以使用 DDX 功能做到这一点。请参阅以下链接:

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    相关资源
    最近更新 更多