Sample code for 30+ languages & platforms
Dart Requires Chilkat v9.5.0.92+

Create XAdES Facturae 3.2 Signed Invoice

See more XAdES Examples

Demonstrates how to create a factura electrónica XAdES digital signature for Gobierno de España

Chilkat Dart Downloads

Dart
import 'package:chilkat/chilkat.dart';

void main() {
  // ---
  // The following source code can be generated from sample XML using the XML Signature Code Generator at chilkat.io
  // ---

  // Create the XML to be signed...
  final xmlToSign = CkXml();
  xmlToSign.tag = 'fe:Facturae';
  xmlToSign.addAttribute('xmlns:ds', 'http://www.w3.org/2000/09/xmldsig#');
  xmlToSign.addAttribute('xmlns:fe', 'http://www.facturae.es/Facturae/2009/v3.2/Facturae');
  xmlToSign.updateChildContent('FileHeader|SchemaVersion', '3.2');
  xmlToSign.updateChildContent('FileHeader|Modality', 'I');
  xmlToSign.updateChildContent('FileHeader|InvoiceIssuerType', 'EM');
  xmlToSign.updateChildContent('FileHeader|Batch|BatchIdentifier', '0000000000B2Emit-');
  xmlToSign.updateChildContent('FileHeader|Batch|InvoicesCount', '1');
  xmlToSign.updateChildContent('FileHeader|Batch|TotalInvoicesAmount|TotalAmount', '63.13');
  xmlToSign.updateChildContent('FileHeader|Batch|TotalOutstandingAmount|TotalAmount', '63.13');
  xmlToSign.updateChildContent('FileHeader|Batch|TotalExecutableAmount|TotalAmount', '63.13');
  xmlToSign.updateChildContent('FileHeader|Batch|InvoiceCurrencyCode', 'EUR');
  xmlToSign.updateChildContent('Parties|SellerParty|TaxIdentification|PersonTypeCode', 'J');
  xmlToSign.updateChildContent('Parties|SellerParty|TaxIdentification|ResidenceTypeCode', 'R');
  xmlToSign.updateChildContent('Parties|SellerParty|TaxIdentification|TaxIdentificationNumber', 'A82735122');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|CorporateName', 'Company Comp SA');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|TradeName', 'Comp');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|RegistrationData|Book', '1');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|RegistrationData|RegisterOfCompaniesLocation', '12AP22');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|RegistrationData|Sheet', '3');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|RegistrationData|Folio', '15');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|RegistrationData|Section', '2');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|RegistrationData|Volume', '12');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|RegistrationData|AdditionalRegistrationData', 'Sin datos');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|AddressInSpain|Address', 'C/ Mayour 33 15 E');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|AddressInSpain|PostCode', '28001');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|AddressInSpain|Town', 'Argamasilla de Alba');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|AddressInSpain|Province', 'Ciudad Real');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|AddressInSpain|CountryCode', 'ESP');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|ContactDetails|Telephone', '917776665');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|ContactDetails|TeleFax', '917776666');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|ContactDetails|WebAddress', 'www.facturae.es');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|ContactDetails|ElectronicMail', 'facturae@mityc.es');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|ContactDetails|ContactPersons', 'Fernando');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|ContactDetails|CnoCnae', '28000');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|ContactDetails|INETownCode', '2134AAB');
  xmlToSign.updateChildContent('Parties|SellerParty|LegalEntity|ContactDetails|AdditionalContactDetails', 'Otros datos');
  xmlToSign.updateChildContent('Parties|BuyerParty|TaxIdentification|PersonTypeCode', 'F');
  xmlToSign.updateChildContent('Parties|BuyerParty|TaxIdentification|ResidenceTypeCode', 'E');
  xmlToSign.updateChildContent('Parties|BuyerParty|TaxIdentification|TaxIdentificationNumber', '0000000000B');
  xmlToSign.updateChildContent('Parties|BuyerParty|AdministrativeCentres|AdministrativeCentre|CentreCode', '1');
  xmlToSign.updateChildContent('Parties|BuyerParty|AdministrativeCentres|AdministrativeCentre|RoleTypeCode', '02');
  xmlToSign.updateChildContent('Parties|BuyerParty|AdministrativeCentres|AdministrativeCentre|Name', 'Ruth');
  xmlToSign.updateChildContent('Parties|BuyerParty|AdministrativeCentres|AdministrativeCentre|FirstSurname', 'Mauripo');
  xmlToSign.updateChildContent('Parties|BuyerParty|AdministrativeCentres|AdministrativeCentre|OverseasAddress|Address', 'Armenia 1922');
  xmlToSign.updateChildContent('Parties|BuyerParty|AdministrativeCentres|AdministrativeCentre|OverseasAddress|PostCodeAndTown', '00000 Buenos Aires');
  xmlToSign.updateChildContent('Parties|BuyerParty|AdministrativeCentres|AdministrativeCentre|OverseasAddress|Province', 'Capital Federal');
  xmlToSign.updateChildContent('Parties|BuyerParty|AdministrativeCentres|AdministrativeCentre|OverseasAddress|CountryCode', 'ARG');
  xmlToSign.updateChildContent('Parties|BuyerParty|AdministrativeCentres|AdministrativeCentre|CentreDescription', 'Centro principal de recepcion');
  xmlToSign.updateChildContent('Parties|BuyerParty|Individual|Name', 'Juana');
  xmlToSign.updateChildContent('Parties|BuyerParty|Individual|FirstSurname', 'Mauripo');
  xmlToSign.updateChildContent('Parties|BuyerParty|Individual|OverseasAddress|Address', 'Juncal 1315');
  xmlToSign.updateChildContent('Parties|BuyerParty|Individual|OverseasAddress|PostCodeAndTown', '00000 Buenos Aires');
  xmlToSign.updateChildContent('Parties|BuyerParty|Individual|OverseasAddress|Province', 'Capital Federal');
  xmlToSign.updateChildContent('Parties|BuyerParty|Individual|OverseasAddress|CountryCode', 'ARG');
  xmlToSign.updateChildContent('Parties|BuyerParty|Individual|ContactDetails|Telephone', '00547775554');
  xmlToSign.updateChildContent('Parties|BuyerParty|Individual|ContactDetails|TeleFax', '00547775555');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceHeader|InvoiceNumber', '2');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceHeader|InvoiceSeriesCode', 'Emit-');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceHeader|InvoiceDocumentType', 'FC');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceHeader|InvoiceClass', 'OO');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceIssueData|IssueDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceIssueData|OperationDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceIssueData|PlaceOfIssue|PostCode', '00000');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceIssueData|PlaceOfIssue|PlaceOfIssueDescription', 'Regalos');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceIssueData|InvoicingPeriod|StartDate', '2010-03-09');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceIssueData|InvoicingPeriod|EndDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceIssueData|InvoiceCurrencyCode', 'EUR');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceIssueData|TaxCurrencyCode', 'EUR');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceIssueData|LanguageName', 'es');
  xmlToSign.updateChildContent('Invoices|Invoice|TaxesOutputs|Tax|TaxTypeCode', '01');
  xmlToSign.updateChildContent('Invoices|Invoice|TaxesOutputs|Tax|TaxRate', '16.00');
  xmlToSign.updateChildContent('Invoices|Invoice|TaxesOutputs|Tax|TaxableBase|TotalAmount', '26.00');
  xmlToSign.updateChildContent('Invoices|Invoice|TaxesOutputs|Tax|TaxAmount|TotalAmount', '4.16');
  xmlToSign.updateChildContent('Invoices|Invoice|TaxesOutputs|Tax|EquivalenceSurcharge', '1.00');
  xmlToSign.updateChildContent('Invoices|Invoice|TaxesOutputs|Tax|EquivalenceSurchargeAmount|TotalAmount', '0.26');
  xmlToSign.updateChildContent('Invoices|Invoice|TaxesOutputs|Tax[1]|TaxTypeCode', '01');
  xmlToSign.updateChildContent('Invoices|Invoice|TaxesOutputs|Tax[1]|TaxRate', '0.00');
  xmlToSign.updateChildContent('Invoices|Invoice|TaxesOutputs|Tax[1]|TaxableBase|TotalAmount', '0.00');
  xmlToSign.updateChildContent('Invoices|Invoice|TaxesWithheld|Tax|TaxTypeCode', '05');
  xmlToSign.updateChildContent('Invoices|Invoice|TaxesWithheld|Tax|TaxRate', '4.00');
  xmlToSign.updateChildContent('Invoices|Invoice|TaxesWithheld|Tax|TaxableBase|TotalAmount', '26.00');
  xmlToSign.updateChildContent('Invoices|Invoice|TaxesWithheld|Tax|TaxAmount|TotalAmount', '1.04');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceTotals|TotalGrossAmount', '59.75');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceTotals|TotalGeneralDiscounts', '0.00');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceTotals|TotalGeneralSurcharges', '0.00');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceTotals|TotalGrossAmountBeforeTaxes', '59.75');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceTotals|TotalTaxOutputs', '4.42');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceTotals|TotalTaxesWithheld', '1.04');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceTotals|InvoiceTotal', '63.13');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceTotals|TotalOutstandingAmount', '63.13');
  xmlToSign.updateChildContent('Invoices|Invoice|InvoiceTotals|TotalExecutableAmount', '63.13');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|IssuerContractReference', 'A9938281');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|IssuerContractDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|IssuerTransactionReference', 'A9938282');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|IssuerTransactionDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|ReceiverContractReference', 'BBBH-38271');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|ReceiverContractDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|ReceiverTransactionReference', 'BBBH-38272');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|ReceiverTransactionDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|FileReference', '000298172');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|FileDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|SequenceNumber', '1.0');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|DeliveryNotesReferences|DeliveryNote|DeliveryNoteNumber', '132413842');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|DeliveryNotesReferences|DeliveryNote|DeliveryNoteDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|DeliveryNotesReferences|DeliveryNote[1]|DeliveryNoteNumber', '987673211');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|DeliveryNotesReferences|DeliveryNote[1]|DeliveryNoteDate', '2010-03-09');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|ItemDescription', 'Flores');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|Quantity', '1.0');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|UnitOfMeasure', '01');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|UnitPriceWithoutTax', '25.000000');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|TotalCost', '25.000000');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|DiscountsAndRebates|Discount|DiscountReason', 'Descuento');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|DiscountsAndRebates|Discount|DiscountRate', '5.0000');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|DiscountsAndRebates|Discount|DiscountAmount', '1.250000');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|Charges|Charge|ChargeReason', 'Cargo');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|Charges|Charge|ChargeAmount', '10.000000');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|GrossAmount', '33.750000');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|TaxesOutputs|Tax|TaxTypeCode', '01');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|TaxesOutputs|Tax|TaxRate', '0.00');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|TaxesOutputs|Tax|TaxableBase|TotalAmount', '0.00');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|TaxesOutputs|Tax|TaxAmount|TotalAmount', '0.00');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|AdditionalLineItemInformation', 'Contacto en Neuquen: Paulita');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|SpecialTaxableEvent|SpecialTaxableEventCode', '01');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|SpecialTaxableEvent|SpecialTaxableEventReason', 'Concepto exento por el motivo aqu definido');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine|ArticleCode', '142');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|IssuerContractDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|IssuerTransactionDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|ReceiverContractDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|ReceiverTransactionDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|FileDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|SequenceNumber', '2.0');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|ItemDescription', 'Mate');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|Quantity', '2.0');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|UnitOfMeasure', '01');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|UnitPriceWithoutTax', '13.000000');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|TotalCost', '26.000000');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|GrossAmount', '26.000000');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|TaxesWithheld|Tax|TaxTypeCode', '05');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|TaxesWithheld|Tax|TaxRate', '4.00');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|TaxesWithheld|Tax|TaxableBase|TotalAmount', '26.00');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|TaxesWithheld|Tax|TaxAmount|TotalAmount', '1.04');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|TaxesOutputs|Tax|TaxTypeCode', '01');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|TaxesOutputs|Tax|TaxRate', '16.00');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|TaxesOutputs|Tax|TaxableBase|TotalAmount', '26.00');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|TaxesOutputs|Tax|TaxAmount|TotalAmount', '4.16');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|TaxesOutputs|Tax|EquivalenceSurcharge', '1.00');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|TaxesOutputs|Tax|EquivalenceSurchargeAmount|TotalAmount', '0.26');
  xmlToSign.updateChildContent('Invoices|Invoice|Items|InvoiceLine[1]|ArticleCode', '122');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|InstallmentDueDate', '2010-03-10');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|InstallmentAmount', '25.00');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|PaymentMeans', '19');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|AccountToBeCredited|IBAN', '4322 3432 22 1341234212');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|AccountToBeCredited|BankCode', '4322');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|AccountToBeCredited|BranchCode', '3432');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|AccountToBeCredited|OverseasBranchAddress|Address', 'Juncal 1423 8 Z');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|AccountToBeCredited|OverseasBranchAddress|PostCodeAndTown', '01115 Capital Federal');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|AccountToBeCredited|OverseasBranchAddress|Province', 'Buenos Aires');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|AccountToBeCredited|OverseasBranchAddress|CountryCode', 'ARG');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|PaymentReconciliationReference', '12223');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|AccountToBeDebited|IBAN', '1234 4312 22 33212341212314');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|AccountToBeDebited|BankCode', '1234');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|AccountToBeDebited|BranchCode', '4312');
  xmlToSign.updateChildContent('Invoices|Invoice|PaymentDetails|Installment|DebitReconciliationReference', '12223');

  final gen = CkXmlDSigGen();

  gen.sigLocation = 'fe:Facturae';
  gen.sigLocationMod = 0;
  gen.sigId = 'Signature869123';
  gen.addSignatureNamespace('etsi', 'http://uri.etsi.org/01903/v1.3.2#');
  gen.sigNamespacePrefix = 'ds';
  gen.sigNamespaceUri = 'http://www.w3.org/2000/09/xmldsig#';
  gen.signedInfoId = 'Signature-SignedInfo241096';
  gen.signedInfoCanonAlg = 'EXCL_C14N';
  gen.signedInfoDigestMethod = 'sha256';

  // Create an Object to be added to the Signature.
  final object1 = CkXml();
  object1.tag = 'xades:QualifyingProperties';
  object1.addAttribute('xmlns:xades', 'http://uri.etsi.org/01903/v1.3.2#');
  // The Id can be any unique string..
  object1.addAttribute('Id', 'QualifyingProperties-e01a8fee-1bee-4ff5-9570-3d57aa02f278');
  object1.addAttribute('Target', '#Signature869123');
  object1.updateAttrAt('xades:SignedProperties', true, 'Id', 'Signature869123-SignedProperties787205');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningTime', 'TO BE GENERATED BY CHILKAT');
  // Note: It may be that http://www.w3.org/2001/04/xmlenc#sha256 is needed in the following line instead of http://www.w3.org/2000/09/xmldsig#sha1
  object1.updateAttrAt('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:CertDigest|ds:DigestMethod', true, 'Algorithm', 'http://www.w3.org/2000/09/xmldsig#sha1');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:CertDigest|ds:DigestValue', 'TO BE GENERATED BY CHILKAT');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SigningCertificateV2|xades:Cert|xades:IssuerSerialV2', 'TO BE GENERATED BY CHILKAT');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyId|xades:Identifier', 'http://www.facturae.es/politica_de_firma_formato_facturae/politica_de_firma_formato_facturae_v3_1.pdf');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyId|xades:Description', 'Polótica de Firma FacturaE v3.1');
  object1.updateAttrAt('xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyHash|ds:DigestMethod', true, 'Algorithm', 'http://www.w3.org/2000/09/xmldsig#sha1');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SignaturePolicyIdentifier|xades:SignaturePolicyId|xades:SigPolicyHash|ds:DigestValue', 'Ohixl6upD6av8N7pEvDABhEL6hM=');
  object1.updateChildContent('xades:SignedProperties|xades:SignedSignatureProperties|xades:SignerRole|xades:ClaimedRoles|xades:ClaimedRole', 'emisor');
  object1.updateAttrAt('xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat', true, 'ObjectReference', '#Reference-ID-670821');
  object1.updateChildContent('xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:Description', 'Factura electrónica');
  object1.updateChildContent('xades:SignedProperties|xades:SignedDataObjectProperties|xades:DataObjectFormat|xades:MimeType', 'text/xml');

  gen.addObject('Signature869123-Object629337', object1.getXml(), '', '');

  gen.addObjectRef('Signature869123-SignedProperties787205', 'sha1', '', '', 'http://uri.etsi.org/01903#SignedProperties');
  gen.setRefIdAttr('Signature869123-SignedProperties787205', 'SignedPropertiesID459347');

  gen.keyInfoId = 'Certificate1570061';
  gen.addSameDocRef('Certificate1570061', 'sha1', '', '', '');

  gen.addSameDocRef('', 'sha1', '', '', '');
  gen.setRefIdAttr('', 'Reference-ID-670821');

  // Provide a certificate + private key. (PFX password is test123)
  final cert = CkCert();
  try {
    cert.loadPfxFile('qa_data/pfx/cert_test123.pfx', 'test123');
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  gen.setX509Cert(cert, true);
  gen.keyInfoType = 'X509Data+KeyValue';
  gen.x509Type = 'Certificate';

  // Load XML to be signed...
  final sbXml = CkStringBuilder();
  xmlToSign.getXmlSb(sbXml);

  gen.behaviors = 'CompactSignedXml';

  // Sign the XML...
  try {
    gen.createXmlDSigSb(sbXml);
  } on ChilkatException catch (e) {
    print(e.lastErrorText);
    return;
  }

  // Save the signed XMl to a file.
  sbXml.writeFile('qa_output/signedXml.xml', 'utf-8', false);

  print(sbXml.getAsString());
}