ABCPRO.NES 1.1.37

dotnet add package ABCPRO.NES --version 1.1.37
NuGet\Install-Package ABCPRO.NES -Version 1.1.37
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="ABCPRO.NES" Version="1.1.37" />
For projects that support PackageReference, copy this XML node into the project file to reference the package.
paket add ABCPRO.NES --version 1.1.37
#r "nuget: ABCPRO.NES, 1.1.37"
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
// Install ABCPRO.NES as a Cake Addin
#addin nuget:?package=ABCPRO.NES&version=1.1.37

// Install ABCPRO.NES as a Cake Tool
#tool nuget:?package=ABCPRO.NES&version=1.1.37

<img src="images/nes_logo.svg" width="200px" style="width: 100px; display:block;"/>

Paczka eADM i Niezbędne Elementy Struktury (dokumentu elektronicznego) 2.0

Zawartość

Biblioteki NES służą do tworzenia paczki eADM, która swoją strukturą odpowiada paczce archiwalnej przekazywanej do Archiwów Państwowych. Paczka oprócz samych dokumentów, zawiera opisujące je pliki metadanych. Więcej informacji można znaleźć w Rozporządzeniu Prezydenta Rzeczypospolitej Polskiej w sprawie szczegółowego sposobu oraz szczegółowych warunków przekazywania skargi wraz z aktami sprawy i odpowiedzią na skargę do sądu administracyjnego (Dz.U. z 2019 r. poz. 1003).

Biblioteki zostały wykorzystane do stworzenia rozwiązania dostępnego pod adresem https://paczka-eadm.abcpro.pl/ pozwalającego na przeglądanie zawartości paczki eADM.

W tym katalogu znajduje się:

  • oryginalny schemat XSD nes_20.xsd dla metadanych paczki eADM i schemat XSD Metadane-1.7.xsd dla metadanych paczki archiwalnej,
  • kod źródłowy biblioteki do tworzenia, edycji i zapisu plików XML metadanych zgodnych ze schematami ABCPRO.NES zarówno w wersji 1.7 jak i 2.0. Biblioteka pozwala na utworzenie pliku XSD na podstawie modelu. W przeciwieństwie do oryginalnego pliku XSD, - który można pobrać również z profilu Ministerstwa Cyfryzacji, ten wygenerowany z modelu nie zawiera żadnych błędów walidacji i referencji do zewnętrznych słowników, wszystkie elementy są opatrzone komentarzem, ponadto dodano możliwość umieszczania elementów ds:Signature czyli odwzorowania podpisów elektronicznych. W katalogu doc znajduje się dokumentacja wygenerowana na podstawie schematu,
  • kod źródłowy biblioteki do tworzenia paczki eADM ABCPRO.NES.ArchivalPackage. Za pomocą biblioteki można tworzyć, edytować i zapisywać dokumenty i metadane w paczce eADM zgodnie z wymogami rozporządzeń.
  • kod źródłowy biblioteki do składania i weryfikacji podpisu elektronicznego plików XML ABCPRO.NES.XAdES
  • kod źródłowy biblioteki do składania i weryfikacji podpisu elektronicznego paczki eADM ABCPRO.NES.ArchivalPackage.Cryptography

NuGet

<a href="https://www.nuget.org/packages/ABCPRO.NES/"><img alt="Nuget" src="https://img.shields.io/nuget/v/ABCPRO.NES?label=abcpro.nes%20nuget"> <img alt="Nuget" src="https://img.shields.io/nuget/dt/ABCPRO.NES"></a>

Historia wersji

Historia wersji ABCPRO.NES

Wersja Opis
1.1.37 Cofnięcie wsparcia dla net6.0.
1.1.36 Dodanie wsparcia dla net6.0.
1.1.34 Obsługa schematu Metadane-1.6.xsd.
1.1.33 Obsługa namespace prefix w XmlSynonyms.
1.1.32 Dodanie do CountryCode pozycji 'Polska'.
1.1.31 Obsługa plikó metadanych 1.7 podczas podpisywania.
1.1.30 Dodanie bardziej szczegółowej weryfikacji nazw plików metadanych (z pominięciem białych znaków i rozszerzeń).
1.1.29 Zmiany wizualizacji podpisu PAdES.
1.1.28 Dodanie wsparcia dla weryfikacji plików XML z transformacją XPath. Poprawki dotyczące zliczania plików metadanych dla plików i folderów w katalogu dokumenty.
1.1.27 Dodanie wsparcia dla wielopodpisu pliku PDF.
1.1.26 Usprawnienia w obsłudze dowolnych plików ZIP.
1.1.25 Usprawnienia w obsłudze dowolnych plików ZIP.
1.1.24 Obsługa dowolnych plików ZIP.
1.1.23 Wsparcie dla zbiorczego pliku metadanych dla podkatalogu w folderze 'dokumenty'.
1.1.22 Usunięcie błędu z duplikacją atrybutu SubjectNameInfo.
1.1.21 Dodanie opcji wyłączenia wizualizacji podpisu PADES.
1.1.20 Dodanie informacji o weryfikacji certyfikatu - status i opis w języku polskim CertificateValidationInfo.
1.1.19 Dodanie atrybutu NeutralLanguage dla zestawów, dodanie brakującej referencji do Microsoft.DotNet.PlatformAbstractions.
1.1.18 Dodano obsługę plików .tar i .tar.gz oraz wspacie dla odczytywania i zapisywania paczki eADM z użyciem strumieni.
1.1.17 Dodano nazwy statusów błędów certyfikatów w języku polskim.
1.1.16 Dodano metody klasy PackageSignerManager pozwalające na pobranie informacji o podpisach dla wszystkich podpisanych dokumentów w paczce eADM (GetSignAndVerifyInfo). Dodano bardziej szczegółowe informacje o przyczynie błędnej weryfikacji podpisu i certyfikatu we właściwości Message zwracanego obiektu SignAndVerifyInfo.
1.1.15 Dodano klasę SignedPackageManager przeznaczonej do pakowania i rozpakowywania paczki eADM wraz z dołączonym plikiem podpisu .xades. Poniżej dołączono przykłąd użycia tej klasy. Poprawiono wydobywanie danych podpisującego z certyfikatu.
1.1.14 Poprawka błędu wystepująca podczas ładowania nieprawidłowej paczki eADM.
1.1.13 Dodanie metody GetSignAndVerifyInfo do pozyskiwania informacji o podpisach pliku.
1.1.12 Poprawiona weryfikacja podpisów wewnętrznych XML.
1.1.11 Dodanie opcji weryfikacji plików ZIPX oraz certyfikatów w podpisach.
1.1.10 Dodanie metody void AddFiles(IEnumerable<DocumentFile> documents, string folderName = null, IEnumerable<IDocument> metadata = null);
1.1.9 Naprawa błędu występującego podczas weryfikacji podpisu w aplikacjach .NetCore 3.x.
1.1.8 Zmiana modyfikatora dostepu na public klas RSAPKCS1SHA256SignatureDescriptionRSAPKCS1SHA512SignatureDescription w Abc.Nes.Xades.
1.1.7 Dodanie metody do weryfikacji wskazanego pliku w paczce eADM.
1.1.6 Dodanie metod do weryfikacji podpisu plików paczki i pliku .xades dla całej paczki eADM.
1.1.5 Dodanie rozszerzeń dla enumeracji.
1.1.4 Dodanie metod do pobierania informacji o podpisach elektronicznych.
1.1.3 Dodanie nowych parametrów do ustawiania wizualizacji podpisu pliku PDF.
1.1.2 Dodanie metody do podpisywania plików PDF z dysku, poprawione wyświetlanie informacji o podpisie na PDF.
1.1.1 Usunięcie błędów z wczytywanie schematu metadanych 1.7, dodanie opcji wskazania serwera znacznika czasu podczas podpisywania.
1.1.0 Złączenie wszystkich bibliotek w jeden pakiet
1.0.10 Dopracowanie opcji zgodności ze schematem Metadane 1.7.
1.0.9 Dodanie wsparcia dla schematu metadanych w wersji 1.7 (Klasa Document17) czyli używanych przez paczkę archiwalną przekazywaną do AP. Natomiast standardowa klasa Document jest zgodna ze schematem 2.0 na potrzeby paczki eADM.
1.0.8 Dodanie polskich opisów błędów przy walidacji metadanych. W pliku AssemblyIno.cs projektu należy dodać dyrektywę [assembly: NeutralResourcesLanguage("pl")] lub z poziomu kodu ustawić inne CultureInfo.
1.0.7 Dodanie przestrzeni nazw Abc.Nes.Validators do wyodrębnienia funkcji walidacji metadanych. W klasieXmlConverter dodano metodę GetValidationResult zwracającą obiekt ze szczegółową lokalizacją błędów.
1.0.5 Zawiera dodatkowe pola w adresie (gmina, powiat, województwo). Dodane metody statyczne do pobierania wartości z enumeratorów dla pól tekstowych np. RelationElement.GetRelationType().
1.0.3 Pierwsza stabilna wersja biblioteki. Pozwala na dodawanie wszystkich metadanych, walidację i zapis do pliku XML. Za pomocą klasy XmlConverter możliwe jest otwieranie plików zarówno z wersji 2.0 jak i tych starszych.

⇪ Do góry

Przykłady

Generowanie schematu XSD
XElement schema;
using (var xsdGenerator = new XsdGenerator()) {
    schema = xsdGenerator.GetSchema();
}
var filePath = @"..\..\..\nes_20_generated.xsd";
schema.Save(filePath);
Tworzenie dokumentu XML metadanych
Abc.Nes.Document document = GetModel(); 
var filePath = Path.Combine(Path.GetTempPath(), "nes.xml");
new Abc.Nes.Converters.XmlConverter().WriteXml(document, filePath);
Ładowanie dokumentu XML metadanych
var filePath = Path.Combine(Path.GetTempPath(), "nes.xml");
if (!File.Exists(filePath)) { throw new FileNotFoundException(); }
var document = new Abc.Nes.Converters.XmlConverter().LoadXml(filePath);
Walidacja dokumentu XML metadanych

Domyslnie komunikaty wyświetlane są w języku angielskim. W celu włączenia komunikatów w języku polskim w pliku AssemblyIno.cs projektu należy dodać dyrektywę [assembly: NeutralResourcesLanguage("pl")] lub z poziomu kodu ustawić polskie CultureInfo.

var filePath = Path.Combine(Path.GetTempPath(), "nes.xml");
if (!File.Exists(filePath)) { throw new FileNotFoundException(); }
ar converter = new Abc.Nes.Converters.XmlConverter();
var valid = converter.Validate(filePath);
// converter.ValidationErrors - errors

W celu wykonania bardziej szczegółowej walidacji należy użyć metody GetValidationResult.

var c = new  Abc.Nes.Validators.DocumentValidator();
var result = c.Validate(GetModel(true));
foreach (var item in result) {
    Console.WriteLine(item.DefaultMessage);                
}
Korzystanie z modelu metadanych
var document = new Abc.Nes.Document() {
    Identifiers = new List<Abc.Nes.Elements.IdentifierElement> {
        new Abc.Nes.Elements.IdentifierElement() {
            Type = Enumerations.IdTypes.ObjectMark.GetIdTypes(),
            Value = "ABC-A.123.77.3.2011.JW.",
            Subject = new Elements.SubjectElement() {
                Institution = new Elements.InstitutionElement() {
                    Name = "Urząd Miasta Wołomierz"
                }
            }
        }
    },
    Titles = new List<Abc.Nes.Elements.TitleElement> {
        new Abc.Nes.Elements.TitleElement(){
            Original = new Abc.Nes.Elements.TitleWithLanguageCodeElement(){
                Type = Enumerations.LanguageCode.pol,
                    Value = "Tytuł dokumentu"
            },
            Alternative = new List<Elements.TitleWithLanguageCodeElement> {
                new Elements.TitleWithLanguageCodeElement() {
                    Type = Enumerations.LanguageCode.eng,
                    Value = "Document title"
                }
            }
        }
    },
    Dates = new List<Elements.DateElement> {
        new Elements.DateElement() {
            Type = Enumerations.EventDateType.Created,
            Date = "2020-06-22"
        }
    },
    Formats = new List<Elements.FormatElement> {
        new Elements.FormatElement() {
            Type = ".pdf",
            Specification = "1.7",
            Uncompleted = Enumerations.BooleanValues.False,
            Size = new Elements.SizeElement() {
                Measure = Enumerations.FileSizeType.kB.GetSizeType(),
                    Value = "4712"
                }
            }
    },
    Access = new List<Elements.AccessElement> {
        new Elements.AccessElement() {
            Access = Enumerations.AccessType.Public,
            Description = "Uwagi dotyczące dostępności",
            Date = new Elements.AccessDateElement() {
                Type = Enumerations.AccessDateType.After,
                Date = "2020-06-23"
            }
        }
    },
    Types = new List<Elements.TypeElement>() {
        new Elements.TypeElement() {
            Class = Enumerations.DocumentClassType.Text.GetDocumentClassType(),
            Kinds = new List<string> { Elements.TypeElement.GetDocumentKindType(Enumerations.DocumentKindType.Document) }
        }
    },
    Groupings = new List<Elements.GroupingElement> {
        new Elements.GroupingElement() {
            Type = "Rejestr korespondencji przychodzącej",
            Code = "RKP01",
            Description = "tekstowy opis grupy"
        }
    },
    Authors = new List<Elements.AuthorElement> {
        new Elements.AuthorElement() {
            Functions = new List<string> { Enumerations.AuthorFunctionType.Created.GetAuthorFunctionType() },
            Subject = new Elements.SubjectElement() {
                Institution = new Elements.InstitutionElement() {
                    Name = "Urząd Miasta Wołomierz"
                }
            }
        }
    },
    Senders = new List<Elements.SenderElement> {
        new Elements.SenderElement() {
            Subject = new Elements.SubjectElement() {
                Institution = new Elements.InstitutionElement() {
                    Name = "Urząd Miasta Wołomierz"
                }
            }
        }
    },
    Recipients = new List<Elements.RecipientElement> {
        new Elements.RecipientElement() {
            CC = Enumerations.BooleanValues.False,
            Subject = new Elements.SubjectElement() {
                Institution = new Elements.InstitutionElement() {
                    Name = "Urząd Miasta Wołomierz"
                }
            }
        },
        new Elements.RecipientElement() {
            CC = Enumerations.BooleanValues.True,
            Subject = new Elements.SubjectElement() {
                Institution = new Elements.InstitutionElement() {
                    Name = "Regionalna Izba Obrachunkowa w Łodzi"
                }
            }
        }
    },
    Relations = new List<Elements.RelationElement> {
        new Elements.RelationElement {
            Identifiers = new List<Elements.IdentifierElement> {
                new Elements.IdentifierElement() {
                    Type = "SystemID",
                    Value = "P00112233.pdf.xades"
                }
            },
            Type = Enumerations.RelationType.HasReference.GetRelationType()
        },
        new Elements.RelationElement {
            Identifiers = new List<Elements.IdentifierElement> {
                new Elements.IdentifierElement() {
                    Type = "SystemID",
                    Value = "dek2010123.txt"
                }
            },
            Type = Enumerations.RelationType.HasAttribution.GetRelationType()
        },
        new Elements.RelationElement {
            Identifiers = new List<Elements.IdentifierElement> {
                new Elements.IdentifierElement() {
                    Type = "SystemID",
                    Value = "P00112233.docx"
                }
            },
            Type = Enumerations.RelationType.IsVersion.GetRelationType()
        },
        new Elements.RelationElement {
            Identifiers = new List<Elements.IdentifierElement> {
                new Elements.IdentifierElement() {
                    Type = "SystemID",
                    Value = "UPD12345.xml"
                }
            },
            Type = Enumerations.RelationType.HasReference.GetRelationType()
        }
    },
    Qualifications = new List<Elements.QualificationElement> {
        new Elements.QualificationElement() {
            Type = Enumerations.ArchivalCategoryType.BE10.GetArchivalCategoryType(),
            Date = "2005-03-05",
            Subject = new Elements.SubjectElement() {
            Institution = new Elements.InstitutionElement() {
                Name = "Urząd Miasta Wołomierz",
                    Unit = new Elements.InstitutionUnitElement() {
                        Name = "Wydział Organizacyjny",
                        Employee = new Elements.EmployeeElement() {
                            FirstNames = new List<string> { "Jan" },
                            Surname = "Kowalski",
                            Position = "Specjalista"
                        }
                    }
                }
            }
        }
    },
    Languages = new List<Elements.LanguageElement>() {
        new Elements.LanguageElement() {
            Type = Enumerations.LanguageCode.pol,
            Value = "polski"
        }
    },
    Description = "projekt dokumentu \"Requirements for elaboration and implementation of information system of General department of Archives\", przekazny przez Przewodniczącą Departamentu Generalnego Archiwów przy Radzie Ministrów Republiki Bułgarii",
    Keywords = new List<Elements.KeywordElement> {
        new Elements.KeywordElement() {
            Matters = new List<string> { "handel" },
            Places = new List<string> { "Polska" },
            Dates = new List<Elements.DateElement> {
                new Elements.DateElement() {
                    Range = Enumerations.DateRangeType.DateFromTo,
                    DateFrom = "2008",
                    DateTo = "2012"
                }
            },
            Others = new List<Elements.KeywordDataElement> {
                new Elements.KeywordDataElement() {
                    Key = "placówki handlowe",
                    Value = "Anna i Jan"
                }
            } 
        }
    },
    Rights = new List<string> { "© Unesco 2003 do polskiego tłumaczenia Naczelna Dyrekcja Archiwów Państwowych" },
    Locations = new List<string> { "Archiwum zakładowe Urzędu Miasta w Wołomierzu" },
    Statuses = new List<Elements.StatusElement> { 
        new Elements.StatusElement() { 
            Kind = "status dokumentu",
            Version = "numer wersji",
            Description = "opis"
        }
    }
};

⇪ Do góry

Ładowanie paczki eADM
var path = @"../../../sample/ValidatedPackage.zip";
var mgr = new PackageManager();
mgr.LoadPackage(path);

var isNotEmpty = mgr != null && mgr.Package != null && !mgr.Package.IsEmpty;
Pobieranie informacji o ilości dokumentów w paczce eADM
var path = @"../../../sample/ValidatedPackage.zip";
var mgr = new PackageManager();
mgr.LoadPackage(path);

var count = mgr.GetDocumentsCount();
Pobieranie listy plików w paczce eADM
var path = @"../../../sample/ValidatedPackage.zip";
var mgr = new PackageManager();
mgr.LoadPackage(path);

var items = mgr.GetAllFiles();
Pobranie pliku metadanych dla wskazanej ścieżki pliku dokumentu
var path = @"../../../sample/ValidatedPackage.zip";
var mgr = new PackageManager();
mgr.LoadPackage(path);

var item = mgr.GetItemByFilePath("Dokumenty/Wniosek/Wniosek.xml");
if (item != null) {
    var metadataFile = mgr.GetMetadataFile(item);                
}
Pobranie obiektu folderu dla wskazanej ścieżki pliku dokumentu
var path = @"../../../sample/ValidatedPackage.zip";
var mgr = new PackageManager();
mgr.LoadPackage(path);

var folder = mgr.GetParentFolder("dokumenty/Wniosek/Wniosek.xml");
Ładowanie, dodanie pliku z metadanymi i zapisanie paczki eADM
var path = @"../../../sample/ValidatedPackage.zip";
var mgr = new PackageManager();
mgr.LoadPackage(path);

mgr.AddFile(new DocumentFile() {
    FileData = File.ReadAllBytes(@"../../../sample/sample_file.pdf"),
    FileName = "TabelaWydatkow.pdf"
}, new Document() {
    Identifiers = new List<Elements.IdentifierElement>() {
        new Elements.IdentifierElement() {
            Type = "Numer tabeli",
            Value = "3",
            Subject = new Elements.SubjectElement() {
                Person = new Elements.PersonElement() {
                    FirstNames = new List<string> { "Jan" },
                    Surname = "Kowalski",
                    Contacts = new List<Elements.ContactElement> {
                        new Elements.ContactElement() {
                            Type = ContactType.Email.GetContactType(),
                                Value = "jan.kowalski@miastowolomierz.pl"
                            }
                        }
                    }
                }
            }
        },
        Titles = new List<Elements.TitleElement> {
            new Elements.TitleElement() {
                Original = new Elements.TitleWithLanguageCodeElement(){
                    Type = LanguageCode.pol,
                    Value = "Tabela wydatków"
                }
            }
        },
        Dates = new List<Elements.DateElement> {
            new Elements.DateElement() {
                Type = EventDateType.Created,
                Date = "2020-04-01 12:32:00"
            }
        },
        Formats = new List<Elements.FormatElement> {
            new Elements.FormatElement() {
                Type = "PDF",
                Specification = "1.7",
                Uncompleted = BooleanValues.False,
                Size = new Elements.SizeElement() {
                    Measure = FileSizeType.bajt.GetSizeType(),
                    Value = new FileInfo(@"../../../sample/sample_file.pdf").Length.ToString()
                }
            }
        },
        Access = new List<Elements.AccessElement> {
            new Elements.AccessElement() {
                Access = AccessType.Public
            }
        },
        Types = new List<Elements.TypeElement> {
            new Elements.TypeElement() {
                Class = DocumentClassType.Text.GetDocumentClassType(),
                Kinds = new List<string> { Elements.TypeElement.GetDocumentKindType(DocumentKindType.Regulation) }
            }
        },
        Groupings = new List<Elements.GroupingElement> {
        new Elements.GroupingElement() {
            Type = "Rejestr wydatków",
            Code = "KS_RW",
            Description = "Księgowość: rejestr wydatków"
        }
    }
});

mgr.Save(@"../../../sample/ValidatedPackage.zip");
Weryfikacja poprawności strukturalnej paczki ADM

Domyslnie komunikaty wyświetlane są w języku angielskim. W celu włączenia komunikatów w języku polskim w pliku AssemblyIno.cs projektu należy dodać dyrektywę [assembly: NeutralResourcesLanguage("pl")] lub z poziomu kodu ustawić polskie CultureInfo.

var path = @"../../../sample/ValidatedPackage.zip";
var mgr = new PackageManager();
mgr.LoadPackage(path);
var validateMetdataFiles = true;
var breakOnFirstError = false;
var result = mgr.Validate(out var message, validateMetdataFiles, breakOnFirstError);
if (!result) {
    throw new System.Exception(message);
}

W celu wykonania bardziej szczegółowej walidacji należy użyć metody GetValidationResult.

var path = @"../../../sample/ValidatedPackage.zip";
var mgr = new PackageManager();
mgr.LoadPackage(path);
var validateMetdataFiles = true;
var breakOnFirstError = false;
var result = mgr.GetValidationResult(validateMetdataFiles, breakOnFirstError);
if (!result.IsCorrect) {
    foreach (var item in result) {
        Console.WriteLine(item.DefaultMessage);
    }
}

⇪ Do góry

Podpisywanie pliku metadanych (podpis w treści pliku XML - enveloped)
var document = GetModel(); // utworzenie modelu dokumentu metadanych
var documentXml = new Abc.Nes.Converters.XmlConverter().GetXml(document); // konwersja modelu do XML

 using (var manager = new XadesManager()) {
    var xml = new MemoryStream(Encoding.UTF8.GetBytes(documentXml.ToString()));
    var result = manager.AppendSignatureToXmlFile(xml, CertUtil.SelectCertificate(),
    new SignatureProductionPlace() {
        City = "Warszawa",
        CountryName = "Polska",
        PostalCode = "03-825",
        StateOrProvince = "mazowieckie"
   },
   new SignerRole("Wiceprezes Zarządu"));

    var filePath = Path.Combine(Path.GetTempPath(), "signature.xml");
    if (File.Exists(filePath)) { File.Delete(filePath); }
    result.Save(filePath);
    // System.Diagnostics.Process.Start(filePath);
}
Podpisywanie pliku PDF (podpis okalający - enveloping)
var path = "../../../doc/nes_20_generated.pdf";
using (var manager = new XadesManager()) {
    var result = manager.CreateEnvelopingSignature(
        new MemoryStream(File.ReadAllBytes(path)), 
        CertUtil.SelectCertificate(),
        new SignatureProductionPlace() {
            City = "Warszawa",
            CountryName = "Polska",
            PostalCode = "03-825",
            StateOrProvince = "mazowieckie"
        },
        new SignerRole("Wiceprezes Zarządu"));

        var filePath = Path.Combine(Path.GetTempPath(), "signature.xml");
        if (File.Exists(filePath)) { File.Delete(filePath); }
        result.Save(filePath);

}
Podpisywanie pliku PDF (podpis zewnętrzny - detached)
var path = "../../../doc/nes_20_generated.pdf";
using (var manager = new XadesManager()) {
    var result = manager.CreateDetachedSignature(new FileInfo(path).FullName, CertUtil.SelectCertificate(),
    new SignatureProductionPlace() {
        City = "Warszawa",
        CountryName = "Polska",
        PostalCode = "03-825",
        StateOrProvince = "mazowieckie"
    },
    new SignerRole("Wiceprezes Zarządu"));

    File.Copy(path, Path.Combine(Path.GetTempPath(), "nes_20_generated.pdf"), true);
    var filePath = Path.Combine(Path.GetTempPath(), "nes_20_generated.pdf.xades");
    if (File.Exists(filePath)) { File.Delete(filePath); }
    result.Save(filePath);

⇪ Do góry

Podpisywanie paczki eADM (podpis okalający - enveloping)
var path = @"../../../sample/ValidatedPackage.zip";
var outputPath = @"../../../sample/SignedPackage.xades";
using (var mgr = new PackageSignerManager()) {
    mgr.Sign(new FileInfo(path).FullName, 
    CertUtil.SelectCertificate(),
    new FileInfo(outputPath).FullName,
    new SignatureProductionPlace() {
        City = "Warszawa",
        CountryName = "Polska",
        PostalCode = "03-825",
        StateOrProvince = "mazowieckie"
    },
    new SignerRole("Wiceprezes Zarządu"),
    true, // Podpisz pliki w paczce eADM
    true, // Podpisz paczkę archiwalną
    false, // w pliku .xades umieść jedynie referencję do pliku paczki (podpis zewnętrzny - detached)
    true, // dodaj znacznik czasu
    "http://time.certum.pl" // adres serwera znacznika czasu
    );
}
Podpisywanie paczki eADM (podpis zewnętrzny - detached)
var path = @"../../../sample/ValidatedPackage.zip";
var outputPath = @"../../../sample/SignedPackage.zip";
using (var mgr = new PackageSignerManager()) {
    mgr.Sign(new FileInfo(path).FullName,
        CertUtil.SelectCertificate(),
        new FileInfo(outputPath).FullName,
        new SignatureProductionPlace() {
            City = "Warszawa",
            CountryName = "Polska",
            PostalCode = "03-825",
            StateOrProvince = "mazowieckie"
        },
        new SignerRole("Wiceprezes Zarządu"),
        true, // Podpisz pliki w paczce eADM
        true, // Podpisz paczkę archiwalną
        true, // w pliku .xades umieść jedynie referencję do pliku paczki (podpis zewnętrzny - detached)
        true  // Podpisz pliki w paczce eADM inne niż XML i PDF podpisem zewnętrznym
        );
}

var outputXadesFilePath = @"../../../sample/SignedPackage.zip.xades";
if (File.Exists(outputXadesFilePath)) {
    // ...
}
Podpisywanie wybranych plików w paczce eADM
var path = @"../../../sample/ValidatedPackage.zip";
var outputPath = @"../../../sample/SignedPackage.zip";
using (var mgr = new PackageSignerManager()) {
    mgr.SignInternalFile(new FileInfo(path).FullName,
        "Dokumenty/TabelaWydatkow.pdf",
        CertUtil.SelectCertificate(),
        new SignatureProductionPlace() {
            City = "Warszawa",
            CountryName = "Polska",
            PostalCode = "03-825",
            StateOrProvince = "mazowieckie"
        },
        new SignerRole("Wiceprezes Zarządu"),
        false, // Podpis zewnętrzny w pliku .xades
        new FileInfo(outputPath).FullName
    );
}
Podpisywanie paczki oraz wybranych plików w paczce eADM
var path = @"../../../sample/ValidatedPackage.zip";
var outputPath = @"../../../sample/SignedPackage.zip";
using (var mgr = new PackageSignerManager()) {
    mgr.Sign(new FileInfo(path).FullName,
        CertUtil.SelectCertificate(),
        new FileInfo(outputPath).FullName,
        new SignatureProductionPlace() {
            City = "Warszawa",
            CountryName = "Polska",
            PostalCode = "03-825",
            StateOrProvince = "mazowieckie"
        },
        new SignerRole("Wiceprezes Zarządu"),
        new string[] {"Dokumenty/Wniosek/Wniosek.xml", "Dokumenty/Tabela_Wydatkow.pdf"}, // Podpisz wybrane pliki w paczce eADM        
        true, // Podpisz paczkę archiwalną
        true, // w pliku .xades umieść jedynie referencję do pliku paczki (podpis zewnętrzny - detached)
        true  // Podpisz pliki w paczce eADM inne niż XML i PDF podpisem zewnętrznym
        );
}

var outputXadesFilePath = @"../../../sample/SignedPackage.zip.xades";
if (File.Exists(outputXadesFilePath)) {
    // ...
}
Podpisywanie pliku PDF znajdującego się na dysku
var path = @"../../../sample/sample_file.pdf";
var imagePath = @"../../../sample/legislator.png";
var outputpath = @"../../../sample/sample_file.signed.pdf";
var mgr = new PackageSignerManager();
mgr.SignPdfFile(
    new FileInfo(path).FullName,
    CertUtil.SelectCertificate(),
    CommitmentTypeId.ProofOfOrigin,
    "Warszawa",
    true,
    // wielkość obrazka 220x50 pikseli
    apperancePngImage :File.ReadAllBytes(new FileInfo(imagePath).FullName),
    apperancePngImageLocation: PdfSignatureLocation.BottomLeft,
    apperanceLocationX: 360F,
    apperanceLocationY: 620F, //700F,
    apperanceWidth: 220F,
    apperanceHeight: 50F,
    margin: 10F,
    outputFilePath: new FileInfo(outputpath).FullName
);
Pobranie informacji o podpisie z pliku .xades
var path = @"../../../sample/SignedPackage.zip.xades";
using (var mgr = new PackageSignerManager()) {
    var result = mgr.GetSignatureInfos(path);    
}
Pobranie informacji o podpisie z pliku w paczce eADM
var path = @"../../../sample/SignedPackage.zip";
using (var mgr = new PackageSignerManager()) {
    var result = mgr.GetSignatureInfos(path, "Dokumenty/LegalAct.pdf"); 
}
Weryfikacja podpisów w paczce eADM
var path = @"../../../sample/SignedPackage.zip";
var list = new List<ArchivalPackage.Cryptography.Model.SignatureVerifyInfo>();
using (var mgr = new PackageSignerManager()) {
    list.AddRange(mgr.VerifySignatures(path));
}
Pobranie informacji o podpisach oraz weryfikacja podpisów w paczce eADM
var path = @"../../../../sample/LegalActRIOzielonagora.zip";
using (var mgr = new PackageSignerManager()) {
    SignAndVerifyInfo[] result = mgr.GetSignAndVerifyInfo(path);
}
Weryfikacja podpisu dla wskazanego pliku w paczce eADM
var path = @"../../../sample/SignedPackage.zip";
var list = new List<ArchivalPackage.Cryptography.Model.SignatureVerifyInfo>();
using (var mgr = new PackageSignerManager()) {
    list.AddRange(mgr.VerifySignatures(path, "Dokumenty/LegalAct.zip.xades"));
}
Weryfikacja podpisów w pliku xades paczki eADM
var path = @"../../../sample/SignedPackage.zip.xades";
var list = new List<ArchivalPackage.Cryptography.Model.SignatureVerifyInfo>();
using (var mgr = new PackageSignerManager()) {
    list.AddRange(mgr.VerifyXadesSignature(path));
}

Obsługa plików TAR i TAR.GZ

Konwersja do pliku ZIP i załadowanie pliku paczki eADM
var path = @"../../../sample/paczka_archiwalna_48.tar";
var pathZip = @"../../../sample/paczka_archiwalna_48.tar.zip";
      
using (var tar = new ArchivalPackage.Formats.Tar.TarFile(path)) {
    if (tar.ConvertToZip(pathZip)) {
        var mgr = new PackageManager();
        mgr.LoadPackage(pathZip);
        var isNotEmpty = mgr != null && mgr.Package != null && !mgr.Package.IsEmpty;
        Assert.IsTrue(isNotEmpty);
    }
}
Konwersja do pliku ZIP i załadowanie paczki eADM z użyciem strumieni
var path = @"../../../sample/paczka_archiwalna_48.tar";
using (var stream = File.OpenRead(path)) {
    using (var tar = new ArchivalPackage.Formats.Tar.TarFile(stream, ArchivalPackage.Formats.Tar.TarType.Tar)) {
        using (var zipStream = tar.ConvertToZip()) {
            if (zipStream != null && zipStream.Length > 0) {
                var mgr = new PackageManager();
                mgr.LoadPackage(zipStream);
                var isNotEmpty = mgr != null && mgr.Package != null && !mgr.Package.IsEmpty;
                Assert.IsTrue(isNotEmpty);
            }
        }
    }
}

Archiwum zawierające paczkę eADM i plik podpisu .xades

Rozpakowanie archiwum zawierającego paczke archiwalną i zewnetrzny plik podpisu .xades i ponowne jej podpisanie
var path = @"../../../sample/Paczka.testowa.30.03.21.podpisana.zip";

var signedPackageManager = new SignedPackageManager();
var info = signedPackageManager.Extract(path);

using (var manager = new XadesManager()) {
    var result = manager.CreateEnvelopingSignature(
        new MemoryStream(File.ReadAllBytes(Path.Combine(info.Directory, info.PackageFileName))), 
        CertUtil.SelectCertificate(),
        new SignatureProductionPlace() {
            City = "Warszawa",
            CountryName = "Polska",
            PostalCode = "03-825",
            StateOrProvince = "mazowieckie"
        },
        new SignerRole("Wiceprezes Zarządu"));

        var filePath = Path.Combine(info.Directory, info.SignatureFileName);
        if (File.Exists(filePath)) { File.Delete(filePath); }
        result.Save(filePath);
}

signedPackageManager.Compress(info);

⇪ Do góry

Historia

Historia niezbędnych elementów dokumentów elektronicznych rozpoczęła się 30 października 2006 roku wraz z wydaniem rozporządzenia Ministra Spraw Wewnętrznych i Administracji w sprawie niezbędnych elementów struktury dokumentów elektronicznych (Dz.U. z 2006 r. Nr 206, poz. 1517).

NES od początku miały opisywać dokumenty przekazywane do Archiwów Państwowych, a rozporządzenie wynika z delegacji zamieszczonej w ustawie o narodowym zasobie archiwalnym i archiwach (Dz.U. z 2019 r. poz. 553), a wydał je Minister Spraw Wewnętrznych i Administracji w rozporządzeniu w sprawie wymagań technicznych formatów zapisu i informatycznych nośników danych, na których utrwalono materiały archiwalne przekazywane do archiwów państwowych (Dz.U. z 2006 r. Nr 206, poz. 1519).

W Dz.U. z 2019 r. pod poz. 1003 opublikowano rozporządzenia Prezydenta Rzeczypospolitej Polskiej z 27 maja 2019 r. w sprawie szczegółowego sposobu oraz szczegółowych warunków przekazywania skargi wraz z aktami sprawy i odpowiedzią na skargę do sądu administracyjnego (Dz.U. z 2019 r. poz. 1003).

Z rozporządzenia wynika, że skargę oraz odpowiedź na skargę organ przekazuje w formie lub postaci, w jakiej zostały sporządzone. Natomiast skargę lub odpowiedź na skargę sporządzoną w formie dokumentu elektronicznego organ przekazuje do elektronicznej skrzynki podawczej sądu.

Jeżeli forma lub postać skargi i odpowiedzi na skargę różnią się, organ, przekazując dokument elektroniczny załącza uwierzytelnioną kopię kwalifikowaną pieczęcią elektroniczną, kwalifikowanym podpisem elektronicznym lub podpisem (profilem) zaufanym.

Akta sprawy organ przekazuje do sądu w takiej postaci, w jakiej są prowadzone. Akta można prowadzić w formie papierowej i elektronicznej. W przypadku gdy akta sprawy są prowadzone w postaci elektronicznej, organ przekazuje akta sprawy w sposób, o którym mowa w §7 ust. 1 rozporządzenia, wraz ze skargą lub odpowiedzią na skargę sporządzoną w formie dokumentu elektronicznego, do elektronicznej skrzynki podawczej sądu. Jeżeli w aktach sprawy prowadzonych w postaci elektronicznej znajdują się dokumenty, których treść nie jest dostępna w całości w postaci elektronicznej, organ przekazuje do sądu:

  • akta sprawy, podając informację o sposobie i dacie przekazania dokumentów, których treść nie jest dostępna w całości w postaci elektronicznej;
  • dokumenty, których treść nie jest dostępna w całości w postaci elektronicznej, wskazując na akta sprawy oraz datę ich przekazania do sądu.

Z §7 rozporządzenia wynika, że akta sprawy prowadzone w postaci elektronicznej przekazuje się jako wyodrębniony z systemu elektronicznego zarządzania dokumentacją, w rozumieniu przepisów o narodowym zasobie archiwalnym i archiwach, zbiór dokumentów obejmujących akta sprawy (paczka eADM). Opisane powyżej biblioteki służą do jej sporządzenia i podpisania bezpiecznym podpisem elektronicznym. Więcej informacji o eADM można znaleźć na stronie gov.legalis.pl.

⇪ Do góry

<a href="https://www.abcpro.pl"><img alt="www" src="https://img.shields.io/badge/www-abcpro.pl-orange?style=for-the-badge"></a>

Product Compatible and additional computed target framework versions.
.NET net5.0 was computed.  net5.0-windows was computed.  net6.0 was computed.  net6.0-android was computed.  net6.0-ios was computed.  net6.0-maccatalyst was computed.  net6.0-macos was computed.  net6.0-tvos was computed.  net6.0-windows was computed.  net7.0 was computed.  net7.0-android was computed.  net7.0-ios was computed.  net7.0-maccatalyst was computed.  net7.0-macos was computed.  net7.0-tvos was computed.  net7.0-windows was computed.  net8.0 was computed.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed. 
.NET Core netcoreapp2.0 was computed.  netcoreapp2.1 was computed.  netcoreapp2.2 was computed.  netcoreapp3.0 was computed.  netcoreapp3.1 was computed. 
.NET Standard netstandard2.0 is compatible.  netstandard2.1 was computed. 
.NET Framework net461 was computed.  net462 was computed.  net463 was computed.  net47 was computed.  net471 was computed.  net472 was computed.  net48 is compatible.  net481 was computed. 
MonoAndroid monoandroid was computed. 
MonoMac monomac was computed. 
MonoTouch monotouch was computed. 
Tizen tizen40 was computed.  tizen60 was computed. 
Xamarin.iOS xamarinios was computed. 
Xamarin.Mac xamarinmac was computed. 
Xamarin.TVOS xamarintvos was computed. 
Xamarin.WatchOS xamarinwatchos was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages (1)

Showing the top 1 NuGet packages that depend on ABCPRO.NES:

Package Downloads
ABCPRO.NES.ArchivalPackage

.NET library for creating archival package (eADM) for Polish State Archives (NES - Necessary elements of electronic documents structure).

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last updated
1.1.37 292 5/15/2023
1.1.36 799 10/5/2022
1.1.35 417 10/5/2022
1.1.34 429 10/4/2022
1.1.33 433 10/3/2022
1.1.32 414 10/3/2022
1.1.31 835 6/2/2022
1.1.30 536 4/13/2022
1.1.29 489 2/14/2022
1.1.28 489 1/28/2022
1.1.27 345 12/17/2021
1.1.26 349 12/10/2021
1.1.25 319 12/9/2021
1.1.24 540 12/6/2021
1.1.23 323 12/3/2021
1.1.22 411 9/24/2021
1.1.21 446 5/20/2021
1.1.20 495 5/7/2021
1.1.19 448 5/5/2021
1.1.18 481 4/8/2021
1.1.17 452 4/2/2021
1.1.16 408 3/31/2021
1.1.15 438 3/30/2021
1.1.14 460 3/22/2021
1.1.13 482 2/10/2021
1.1.12 447 2/5/2021
1.1.11 441 2/2/2021
1.1.10 406 1/29/2021
1.1.9 429 1/15/2021
1.1.8 410 1/14/2021
1.1.7 453 1/13/2021
1.1.6 485 1/12/2021
1.1.5 475 1/4/2021
1.1.4 438 1/4/2021
1.1.3 523 12/18/2020
1.1.2 523 12/17/2020
1.1.1 494 12/9/2020
1.1.0 579 12/8/2020
1.0.10 2,051 9/29/2020
1.0.9 1,098 9/24/2020
1.0.8 1,111 8/19/2020
1.0.7 1,064 8/18/2020
1.0.5 3,014 6/25/2020
1.0.3 1,015 6/24/2020
1.0.2 612 6/22/2020
1.0.1 559 6/19/2020
1.0.0 609 6/19/2020

Remove support for net6.0.