Sample code for 30+ languages & platforms
PureBasic

Extract Metadata XML from PDF

See more PDF Signatures Examples

Demonstrates how to extract the metadata XML from a PDF.

Chilkat PureBasic Downloads

PureBasic
IncludeFile "CkXml.pb"
IncludeFile "CkStringBuilder.pb"
IncludeFile "CkPdf.pb"

Procedure ChilkatExample()

    success.i = 0

    ; This example requires the Chilkat API to have been previously unlocked.
    ; See Global Unlock Sample for sample code.

    pdf.i = CkPdf::ckCreate()
    If pdf.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    success = CkPdf::ckLoadFile(pdf,"qa_data/pdf/blank_with_metadata.pdf")
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf)
        CkPdf::ckDispose(pdf)
        ProcedureReturn
    EndIf

    sbXml.i = CkStringBuilder::ckCreate()
    If sbXml.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    ; Note: Not all PDF files have metadata.  Metadata is optional.
    success = CkPdf::ckGetMetadata(pdf,sbXml)
    If success = 0
        Debug CkPdf::ckLastErrorText(pdf)
        CkPdf::ckDispose(pdf)
        CkStringBuilder::ckDispose(sbXml)
        ProcedureReturn
    EndIf

    xml.i = CkXml::ckCreate()
    If xml.i = 0
        Debug "Failed to create object."
        ProcedureReturn
    EndIf

    CkXml::ckLoadSb(xml,sbXml,1)

    Debug CkXml::ckGetXml(xml)

    ; Sample PDF metadata XML:
    ; (Code for parsing follows)

    ; Use this online tool to generate parsing code from sample XML: 
    ; Generate Parsing Code from XML

    ; <?xml version="1.0" encoding="utf-8"?>
    ; <x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 9.1-c001 79.675d0f7, 2023/06/11-19:21:16        ">
    ;     <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
    ;         <rdf:Description rdf:about="" xmlns:xmp="http://ns.adobe.com/xap/1.0/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:xmpMM="http://ns.adobe.com/xap/1.0/mm/" xmlns:pdf="http://ns.adobe.com/pdf/1.3/" xmlns:xmpRights="http://ns.adobe.com/xap/1.0/rights/">
    ;             <xmp:ModifyDate>2024-11-27T11:33:12-06:00</xmp:ModifyDate>
    ;             <xmp:CreateDate>2024-11-27T11:28:23-06:00</xmp:CreateDate>
    ;             <xmp:MetadataDate>2024-11-27T11:33:12-06:00</xmp:MetadataDate>
    ;             <xmp:CreatorTool>Adobe Acrobat Pro (32-bit) 24.3.20112</xmp:CreatorTool>
    ;             <dc:format>application/pdf</dc:format>
    ;             <dc:title>
    ;                 <rdf:Alt>
    ;                     <rdf:li xml:lang="x-default">Blank</rdf:li>
    ;                 </rdf:Alt>
    ;             </dc:title>
    ;             <dc:creator>
    ;                 <rdf:Bag>
    ;                     <rdf:li>Chilkat Software</rdf:li>
    ;                 </rdf:Bag>
    ;             </dc:creator>
    ;             <dc:description>
    ;                 <rdf:Alt>
    ;                     <rdf:li xml:lang="x-default">Blank Document</rdf:li>
    ;                 </rdf:Alt>
    ;             </dc:description>
    ;             <dc:subject>
    ;                 <rdf:Bag>
    ;                     <rdf:li>blank</rdf:li>
    ;                     <rdf:li>metadata</rdf:li>
    ;                     <rdf:li>document</rdf:li>
    ;                 </rdf:Bag>
    ;             </dc:subject>
    ;             <xmpMM:DocumentID>uuid:34535ffa-b632-43f1-b1fd-80cea6fdc351</xmpMM:DocumentID>
    ;             <xmpMM:InstanceID>uuid:69ace620-4c54-407f-8d45-6eebc90f34c2</xmpMM:InstanceID>
    ;             <pdf:Producer>Adobe Acrobat Pro (32-bit) 24.3.20112</pdf:Producer>
    ;             <pdf:Keywords>blank; metadata; document</pdf:Keywords>
    ;             <xmpRights:WebStatement>https://www.chilkatsoft.com/</xmpRights:WebStatement>
    ;         </rdf:Description>
    ;     </rdf:RDF>
    ; </x:xmpmeta>

    x_xmpmeta_xmlns_x.s = CkXml::ckGetAttrValue(xml,"xmlns:x")
    x_xmpmeta_x_xmptk.s = CkXml::ckGetAttrValue(xml,"x:xmptk")
    rdf_RDF_xmlns_rdf.s = CkXml::ckChilkatPath(xml,"rdf:RDF|(xmlns:rdf)")
    rdf_Description_rdf_about.s = CkXml::ckChilkatPath(xml,"rdf:RDF|rdf:Description|(rdf:about)")
    rdf_Description_xmlns_xmp.s = CkXml::ckChilkatPath(xml,"rdf:RDF|rdf:Description|(xmlns:xmp)")
    rdf_Description_xmlns_dc.s = CkXml::ckChilkatPath(xml,"rdf:RDF|rdf:Description|(xmlns:dc)")
    rdf_Description_xmlns_xmpMM.s = CkXml::ckChilkatPath(xml,"rdf:RDF|rdf:Description|(xmlns:xmpMM)")
    rdf_Description_xmlns_pdf.s = CkXml::ckChilkatPath(xml,"rdf:RDF|rdf:Description|(xmlns:pdf)")
    rdf_Description_xmlns_xmpRights.s = CkXml::ckChilkatPath(xml,"rdf:RDF|rdf:Description|(xmlns:xmpRights)")
    xmp_ModifyDate.s = CkXml::ckGetChildContent(xml,"rdf:RDF|rdf:Description|xmp:ModifyDate")
    xmp_CreateDate.s = CkXml::ckGetChildContent(xml,"rdf:RDF|rdf:Description|xmp:CreateDate")
    xmp_MetadataDate.s = CkXml::ckGetChildContent(xml,"rdf:RDF|rdf:Description|xmp:MetadataDate")
    xmp_CreatorTool.s = CkXml::ckGetChildContent(xml,"rdf:RDF|rdf:Description|xmp:CreatorTool")
    dc_format.s = CkXml::ckGetChildContent(xml,"rdf:RDF|rdf:Description|dc:format")
    rdf_li_xml_lang.s = CkXml::ckChilkatPath(xml,"rdf:RDF|rdf:Description|dc:title|rdf:Alt|rdf:li|(xml:lang)")
    rdf_li.s = CkXml::ckGetChildContent(xml,"rdf:RDF|rdf:Description|dc:title|rdf:Alt|rdf:li")
    rdf_li = CkXml::ckGetChildContent(xml,"rdf:RDF|rdf:Description|dc:creator|rdf:Bag|rdf:li")
    rdf_li_xml_lang = CkXml::ckChilkatPath(xml,"rdf:RDF|rdf:Description|dc:description|rdf:Alt|rdf:li|(xml:lang)")
    rdf_li = CkXml::ckGetChildContent(xml,"rdf:RDF|rdf:Description|dc:description|rdf:Alt|rdf:li")
    i.i = 0
    count_i.i = CkXml::ckNumChildrenHavingTag(xml,"rdf:RDF|rdf:Description|dc:subject|rdf:Bag|rdf:li")
    While i < count_i
        CkXml::setCkI(xml, i)
        rdf_li = CkXml::ckGetChildContent(xml,"rdf:RDF|rdf:Description|dc:subject|rdf:Bag|rdf:li[i]")
        i = i + 1
    Wend
    xmpMM_DocumentID.s = CkXml::ckGetChildContent(xml,"rdf:RDF|rdf:Description|xmpMM:DocumentID")
    xmpMM_InstanceID.s = CkXml::ckGetChildContent(xml,"rdf:RDF|rdf:Description|xmpMM:InstanceID")
    pdf_Producer.s = CkXml::ckGetChildContent(xml,"rdf:RDF|rdf:Description|pdf:Producer")
    pdf_Keywords.s = CkXml::ckGetChildContent(xml,"rdf:RDF|rdf:Description|pdf:Keywords")
    xmpRights_WebStatement.s = CkXml::ckGetChildContent(xml,"rdf:RDF|rdf:Description|xmpRights:WebStatement")


    CkPdf::ckDispose(pdf)
    CkStringBuilder::ckDispose(sbXml)
    CkXml::ckDispose(xml)


    ProcedureReturn
EndProcedure