Skip to main content
Version: Version 1.5

Pdftools SDK code samples

Start using the Pdftools SDK library with code samples. Integrate advanced PDF manipulation, optimization, and validation tasks into your application in Java, .NET, C, and Python.

info

Select a code sample in a specific language and download it. The code samples illustrate how to integrate the SDK into your projects for specific use cases. Each code sample includes a README file that gives instructions on how to run the code sample to process one or multiple files.

tip

Do you miss a specific sample and want us to include it here? Let us know through the Contact page, and we'll add it to our sample backlog.

Assembling documents

Merge PDFs

1// Create output stream
2pOutStream = _tfopen(szOutPath, _T("wb+"));
3GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutStream, _T("Failed to create output file \"%s\" for writing.\n"), szOutPath);
4TPdfToolsSys_StreamDescriptor outDesc;
5PdfToolsSysCreateFILEStreamDescriptor(&outDesc, pOutStream, 0);
6pAssembler = PdfToolsDocumentAssembly_DocumentAssembler_New(&outDesc, NULL, NULL);
7
8for (int i = 1; i < argc - 1; i++)
9{
10    szInPath = argv[i];
11    // Open input document
12    pInStream = _tfopen(szInPath, _T("rb"));
13    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInStream, _T("Failed to open the input file \"%s\" for reading.\n"),
14                                     szInPath);
15    TPdfToolsSys_StreamDescriptor inDesc;
16    PdfToolsSysCreateFILEStreamDescriptor(&inDesc, pInStream, 0);
17    pInDoc = PdfToolsPdf_Document_Open(&inDesc, _T(""));
18    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(
19        pInDoc, _T("Failed to create a document from the input file \"%s\". %s (ErrorCode: 0x%08x).\n"), szInPath,
20        szErrorBuff, PdfTools_GetLastError());
21
22    // Append the content of the input documents to the output document
23    GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(
24        PdfToolsDocumentAssembly_DocumentAssembler_Append(pAssembler, pInDoc, NULL, NULL, NULL, NULL),
25        _T("Failed to append a page. (ErrorCode: 0x%08x).\n"), PdfTools_GetLastError());
26
27    PdfToolsPdf_Document_Close(pInDoc);
28    fclose(pInStream);
29    pInDoc    = NULL;
30    pInStream = NULL;
31}
32// Merge input documents into an output document
33pOutDoc = PdfToolsDocumentAssembly_DocumentAssembler_Assemble(pAssembler);
34
35GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutDoc, _T("The processing has failed. (ErrorCode: 0x%08x).\n"),
36                                 PdfTools_GetLastError());
37
Download code sample
1private static void Merge(IEnumerable<string> inPaths, string outPath)
2{
3    // Create output stream
4    using var outStream = File.Create(outPath);
5    using var docAssembler = new PdfTools.DocumentAssembly.DocumentAssembler(outStream);
6
7    foreach (var inPath in inPaths)
8    {
9        using var inStream = File.OpenRead(inPath);
10        using var inDoc = PdfTools.Pdf.Document.Open(inStream);
11        // Append the content of the input documents to the output document
12        docAssembler.Append(inDoc);
13    }
14
15    // Merge input documents into an output document
16    docAssembler.Assemble();
17}
Download code sample
1    private static void merge(String[] inPaths, String outPath) throws Exception
2    {
3    	try (
4            // Create output stream
5            FileStream outStream = new FileStream(outPath, FileStream.Mode.READ_WRITE_NEW);
6            DocumentAssembler docAssembler = new DocumentAssembler(outStream)) {
7            for (String inPath : inPaths) {
8	            try (
9	                // Open input document
10	                FileStream inStr = new FileStream(inPath, FileStream.Mode.READ_ONLY);
11	                Document inDoc = Document.open(inStr)) {
12	                // Append the content of each input document to the output document
13	                docAssembler.append(inDoc);
14	            }
15            }
16            // Merge input documents into an output document
17            docAssembler.assemble();
18    	}
19    }
Download code sample
1# Create output stream for writing
2with io.FileIO(output_file_path, 'wb+') as output_stream:
3    output_stream_descriptor = StreamDescriptor(output_stream)
4    output_options = pdf_outputoptions_new()
5    assembler = documentassembly_documentassembler_new(output_stream_descriptor, output_options, None)
6    for i in range(0, len(input_files)):
7        # Open input document
8        with io.FileIO(input_files[i], 'rb') as input_file:
9            input_stream_descriptor = StreamDescriptor(input_file)
10            input_document = pdf_document_open(input_stream_descriptor, None)
11            if not input_document:
12                print_error_message("Failed to open input document.")
13                exit(1)
14
15            # Append the content of the input documents to the output document
16            documentassembly_documentassembler_append(assembler, input_document, None, None, None, None)
17
18    # Merge input documents into an output document
19    out_doc = documentassembly_documentassembler_assemble(assembler)
20    if not out_doc:
21        print_error_message("Error while merging PDFs.")
22        exit(1)
23
24    documentassembly_documentassembler_close(assembler)
25    pdf_document_close(out_doc)
26
Download code sample
1Private Sub Merge(inPaths As IEnumerable(Of String), outPath As String)
2    ' Create output stream
3    Using outStream = File.Create(outPath)
4        Using docAssembler = New PdfTools.DocumentAssembly.DocumentAssembler(outStream)
5
6            For Each inPath In inPaths
7                Using inStream = File.OpenRead(inPath)
8                    Using inDoc = PdfTools.Pdf.Document.Open(inStream)
9                        ' Append the content of the input documents to the output document
10                        docAssembler.Append(inDoc)
11                    End Using
12                End Using
13            Next
14
15            ' Merge input documents into an output document
16            docAssembler.Assemble()
17        End Using
18    End Using
19End Sub
Download code sample

Split PDF document

1// Open input document
2pInStream = _tfopen(szInPath, _T("rb"));
3GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInStream, _T("Failed to open the input file \"%s\" for reading.\n"), szInPath);
4TPdfToolsSys_StreamDescriptor inDesc;
5PdfToolsSysCreateFILEStreamDescriptor(&inDesc, pInStream, 0);
6pInDoc = PdfToolsPdf_Document_Open(&inDesc, _T(""));
7
8GOTO_CLEANUP_IF_NULL_PRINT_ERROR(
9    pInDoc, _T("Failed to create a document from the input file \"%s\". %s (ErrorCode: 0x%08x).\n"), szInPath,
10    szErrorBuff, PdfTools_GetLastError());
11
12// Split input document by generating one output document per page
13int   nPageCount = PdfToolsPdf_Document_GetPageCount(pInDoc);
14TCHAR szPageFileName[256];
15for (int i = 1; i <= nPageCount; i++)
16{
17    CreateOutputFileName(szPageFileName, szOutPath, i);
18
19    // Create output stream for each page of the input document
20    pOutStream = _tfopen(szPageFileName, _T("wb+"));
21    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutStream, _T("Failed to open the input file \"%s\" for reading.\n"),
22                                     szPageFileName);
23    TPdfToolsSys_StreamDescriptor outDesc;
24    PdfToolsSysCreateFILEStreamDescriptor(&outDesc, pOutStream, 0);
25
26    // Split pdf into pages
27    pAssembler = PdfToolsDocumentAssembly_DocumentAssembler_New(&outDesc, NULL, NULL);
28    GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(
29        PdfToolsDocumentAssembly_DocumentAssembler_Append(pAssembler, pInDoc, &i, &i, NULL, NULL),
30        _T("Failed to append a page. (ErrorCode: 0x%08x).\n"), PdfTools_GetLastError());
31    pOutDoc = PdfToolsDocumentAssembly_DocumentAssembler_Assemble(pAssembler);
32    PdfToolsDocumentAssembly_DocumentAssembler_Close(pAssembler);
33
34    if (pOutDoc)
35        PdfToolsPdf_Document_Close(pOutDoc);
36    if (pOutStream)
37        fclose(pOutStream);
38    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutDoc, _T("The processing has failed. (ErrorCode: 0x%08x).\n"),
39                                     PdfTools_GetLastError());
40}
41
Download code sample
1private static void Split(string inPath, string outPathPrefix)
2{
3    // Open input document
4    using var inStream = File.OpenRead(inPath);
5    using var inDoc = PdfTools.Pdf.Document.Open(inStream);
6
7    // Split the input document page by page
8    for (int i = 1; i <= inDoc.PageCount; ++i)
9    {
10        using var outStream = File.Create(outPathPrefix + "_page_" + i + ".pdf");
11        using var docAssembler = new PdfTools.DocumentAssembly.DocumentAssembler(outStream);
12        docAssembler.Append(inDoc, i, i);
13        docAssembler.Assemble();
14    }
15}
Download code sample
1private static void split(String inPath, String outPathPrefix) throws Exception
2{
3    try (
4        // Open input document
5        FileStream inStr = new FileStream(inPath, FileStream.Mode.READ_ONLY);
6        Document inDoc = Document.open(inStr)) {
7        for (int i = 1; i <= inDoc.getPageCount(); ++i) {
8            try (
9                // Create output stream for each page of the input document
10                FileStream outStream = new FileStream(outPathPrefix + "_page_" + i + ".pdf", FileStream.Mode.READ_WRITE_NEW);
11                DocumentAssembler docAssembler = new DocumentAssembler(outStream)) {
12                docAssembler.append(inDoc, i, i);
13                docAssembler.assemble();
14            }
15        }
16    }
17}
Download code sample
1# Open input document
2with io.FileIO(input_file_path, 'rb') as input_file:
3    input_stream_descriptor = StreamDescriptor(input_file)
4    input_document = pdf_document_open(input_stream_descriptor, None)
5    if not input_document:
6        print_error_message("Failed to open input document.")
7        exit(1)
8
9    # Split file generating one PDF per page
10    page_count = pdf_document_getpagecount(input_document)            
11    output_options = pdf_outputoptions_new()
12    for i in range(1, page_count + 1):
13        current_out_file = construct_file_name(output_file_path, i)
14        # Create output stream for each page of the input document
15        with io.FileIO(current_out_file, 'wb+') as output_file:
16            output_stream_descriptor = StreamDescriptor(output_file)
17
18            # Split PDF into single page
19            assembler = documentassembly_documentassembler_new(output_stream_descriptor, output_options, None)
20            documentassembly_documentassembler_append(assembler, input_document, i, i, None, None)
21            out_doc = documentassembly_documentassembler_assemble(assembler)
22            if not out_doc:
23                print_error_message("Error while splitting document.")
24                exit(1)  
25
26            documentassembly_documentassembler_close(assembler)
27            pdf_document_close(out_doc)
28
29        print(f"Successfully splitted page {i} and created file {current_out_file}.")
30    pdf_document_close(input_document)
31
Download code sample
1Private Sub Split(inPath As String, outPathPrefix As String)
2    ' Open input document
3    Using inStream = File.OpenRead(inPath)
4        Using inDoc = PdfTools.Pdf.Document.Open(inStream)
5
6            ' Split the input document page by page
7            For i As Integer = 1 To inDoc.PageCount
8                Using outStream = File.Create(outPathPrefix & "_page_" & i & ".pdf")
9                    Using docAssembler = New PdfTools.DocumentAssembly.DocumentAssembler(outStream)
10                        docAssembler.Append(inDoc, i, i)
11                        docAssembler.Assemble()
12                    End Using
13                End Using
14            Next
15        End Using
16    End Using
17End Sub
Download code sample

Converting documents to PDF/A

Convert a PDF document to PDF/A-2b if necessary

1void EventListener(void* pContext, const char* szDataPart, const char* szMessage,
2                   TPdfToolsPdfAConversion_EventSeverity iSeverity, TPdfToolsPdfAConversion_EventCategory iCategory,
3                   TPdfToolsPdfAConversion_EventCode iCode, const char* szContext, int iPageNo)
4{
5    // iSeverity is the event's suggested severity
6    // Optionally the suggested severity can be changed according to
7    // the requirements of your conversion process and, for example,
8    // the event's category (e.Category).
9
10    if (iSeverity > iEventsSeverity)
11        iEventsSeverity = iSeverity;
12
13    // Report conversion event
14    TCHAR cSeverity = iSeverity == ePdfToolsPdfAConversion_EventSeverity_Information ? 'I'
15                      : ePdfToolsPdfAConversion_EventSeverity_Warning                ? 'W'
16                                                                                     : 'E';
17    if (iPageNo > 0)
18        _tprintf(_T("- %c %d: %s (%s on page %d)\n"), cSeverity, iCategory, szMessage, szContext, iPageNo);
19    else
20        _tprintf(_T("- %c %d: %s (%s)\n"), cSeverity, iCategory, szMessage, szContext);
21}
1void ConvertIfNotConforming(const TCHAR* szInPath, const TCHAR* szOutPath, TPdfToolsPdf_Conformance iConf)
2{
3    TPdfToolsPdfAValidation_AnalysisOptions*   pAOpt      = NULL;
4    TPdfToolsPdfAValidation_Validator*         pValidator = NULL;
5    TPdfToolsPdfAValidation_AnalysisResult*    pARes      = NULL;
6    TPdfToolsPdfAConversion_ConversionOptions* pConvOpt   = NULL;
7    TPdfToolsPdfAConversion_Converter*         pConv      = NULL;
8    TPdfToolsPdf_Document*                     pOutDoc    = NULL;
9    TPdfToolsPdf_Document*                     pInDoc     = NULL;
10    FILE*                                      pInStream  = NULL;
11    FILE*                                      pOutStream = NULL;
12
13    // Open input document
14    pInStream = _tfopen(szInPath, _T("rb"));
15    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInStream, _T("Failed to open the input file \"%s\" for reading.\n"), szInPath);
16    TPdfToolsSys_StreamDescriptor inDesc;
17    PdfToolsSysCreateFILEStreamDescriptor(&inDesc, pInStream, 0);
18    pInDoc = PdfToolsPdf_Document_Open(&inDesc, _T(""));
19    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInDoc, _T("Failed to open document \"%s\". %s (ErrorCode: 0x%08x).\n"), szInPath,
20                                     szErrBuf, PdfTools_GetLastError());
21
22    // Create validator to analyze PDF/A standard conformance of input document
23    pAOpt = PdfToolsPdfAValidation_AnalysisOptions_New();
24    PdfToolsPdfAValidation_AnalysisOptions_SetConformance(pAOpt, iConf);
25    pValidator = PdfToolsPdfAValidation_Validator_New();
26    pARes      = PdfToolsPdfAValidation_Validator_Analyze(pValidator, pInDoc, pAOpt);
27    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pARes, _T("Failed to analyze document. %s (ErrorCode: 0x%08x).\n"), szErrBuf,
28                                     PdfTools_GetLastError());
29
30    // Check if conversion to PDF/A is necessary
31    if (PdfToolsPdfAValidation_AnalysisResult_IsConforming(pARes))
32    {
33        printf("Document conforms to %s already.\n", PdfToolsPdf_Conformance_ToStringA(iConf));
34        goto cleanup;
35    }
36
37    // Create output stream for writing
38    pOutStream = _tfopen(szOutPath, _T("wb+"));
39    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutStream, _T("Failed to create the output file \"%s\".\n"), szOutPath);
40    TPdfToolsSys_StreamDescriptor outDesc;
41    PdfToolsSysCreateFILEStreamDescriptor(&outDesc, pOutStream, 0);
42
43    // Convert the input document to PDF/A using the converter object
44    // and its conversion event handler
45    pConvOpt = PdfToolsPdfAConversion_ConversionOptions_New();
46    pConv    = PdfToolsPdfAConversion_Converter_New();
47    PdfToolsPdfAConversion_Converter_AddConversionEventHandlerA(
48        pConv, NULL, (TPdfToolsPdfAConversion_Converter_ConversionEventA)EventListener);
49    pOutDoc = PdfToolsPdfAConversion_Converter_Convert(pConv, pARes, pInDoc, &outDesc, pConvOpt, NULL);
50    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutDoc, _T("Failed to convert document. %s (ErrorCode: 0x%08x).\n"), szErrBuf,
51                                     PdfTools_GetLastError());
52
53    // Check if critical conversion events occurred
54    switch (iEventsSeverity)
55    {
56    case ePdfToolsPdfAConversion_EventSeverity_Information:
57    {
58        TPdfToolsPdf_Conformance iOutConf;
59        PdfToolsPdf_Document_GetConformance(pOutDoc, &iOutConf);
60        printf("Successfully converted document to %s.\n", PdfToolsPdf_Conformance_ToStringA(iOutConf));
61        break;
62    }
63
64    case ePdfToolsPdfAConversion_EventSeverity_Warning:
65    {
66        TPdfToolsPdf_Conformance iOutConf;
67        PdfToolsPdf_Document_GetConformance(pOutDoc, &iOutConf);
68        printf("Warnings occurred during the conversion of document to %s.\n",
69               PdfToolsPdf_Conformance_ToStringA(iOutConf));
70        printf("Check the output file to decide if the result is acceptable.\n");
71        break;
72    }
73
74    case ePdfToolsPdfAConversion_EventSeverity_Error:
75    {
76        printf("Unable to convert document to %s because of critical conversion events.\n",
77               PdfToolsPdf_Conformance_ToStringA(iConf));
78        break;
79    }
80    }
81
82cleanup:
83    PdfToolsPdf_Document_Close(pOutDoc);
84    PdfTools_Release(pConv);
85    PdfTools_Release(pConvOpt);
86    PdfTools_Release(pARes);
87    PdfTools_Release(pValidator);
88    PdfTools_Release(pAOpt);
89    PdfToolsPdf_Document_Close(pInDoc);
90    if (pInStream)
91        fclose(pInStream);
92    if (pOutStream)
93        fclose(pOutStream);
94}
Download code sample
1static void ConvertIfNotConforming(string inPath, string outPath, Conformance conformance)
2{
3    // Open input document
4    using var inStr = File.OpenRead(inPath);
5    using var inDoc = Document.Open(inStr);
6
7    // Create the Validator object, and use the Conformance object to create
8    // an AnalysisOptions object that controls the behavior of the Validator.
9    var validator = new Validator();
10    var analysisOptions = new AnalysisOptions() { Conformance = conformance };
11
12    // Run the analysis, and check the results.
13    // Only proceed if document is not conforming.
14    var analysisResult = validator.Analyze(inDoc, analysisOptions);
15    if (analysisResult.IsConforming)
16    {
17        Console.WriteLine($"Document conforms to {inDoc.Conformance} already.");
18        return;
19    }
20
21    // Create a converter object
22    var converter = new Converter();
23
24    // Add handler for conversion events
25    var eventsSeverity = EventSeverity.Information;
26    converter.ConversionEvent += (s, e) =>
27    {
28        // Get the event's suggested severity
29        var severity = e.Severity;
30
31        // Optionally the suggested severity can be changed according to
32        // the requirements of your conversion process and, for example,
33        // the event's category (e.Category).
34
35        if (severity > eventsSeverity)
36            eventsSeverity = severity;
37
38        // Report conversion event
39        Console.WriteLine("- {0} {1}: {2} ({3}{4})",
40            severity.ToString()[0], e.Category, e.Message, e.Context, e.PageNo > 0 ? " page " + e.PageNo : ""
41        );
42    };
43
44    // Create stream for output file
45    using var outStr = File.Create(outPath);
46
47    // Convert the input document to PDF/A using the converter object
48    // and its conversion event handler
49    using var outDoc = converter.Convert(analysisResult, inDoc, outStr);
50
51    // Check if critical conversion events occurred
52    switch (eventsSeverity)
53    {
54        case EventSeverity.Information:
55            Console.WriteLine($"Successfully converted document to {outDoc.Conformance}.");
56            break;
57
58        case EventSeverity.Warning:
59            Console.WriteLine($"Warnings occurred during the conversion of document to {outDoc.Conformance}.");
60            Console.WriteLine($"Check the output file to decide if the result is acceptable.");
61            break;
62
63        case EventSeverity.Error:
64            throw new Exception($"Unable to convert document to {conformance} because of critical conversion events.");
65    }
66}
Download code sample
1private static void convertIfNotConforming(String inPath, String outPath, Conformance conformance) throws Exception
2{
3    // Open input document
4    try (FileStream inStr = new FileStream(inPath, FileStream.Mode.READ_ONLY);
5         Document inDoc = Document.open(inStr))
6    {
7        // Create the Validator object, and use the Conformance object to create
8        // an AnalysisOptions object that controls the behavior of the Validator.
9        Validator validator = new Validator();
10        AnalysisOptions analysisOptions = new AnalysisOptions();
11        analysisOptions.setConformance(conformance);
12
13        // Run the analysis, and check the results.
14        // Only proceed if document is not conforming.
15        AnalysisResult analysisResult = validator.analyze(inDoc, analysisOptions);
16        if (analysisResult.getIsConforming())
17        {
18            System.out.println("Document conforms to " + inDoc.getConformance() + " already.");
19            return;
20        }
21
22        // Create output stream
23        try (FileStream outStr = new FileStream(outPath, FileStream.Mode.READ_WRITE_NEW))
24        {
25            // Create a converter object
26            Converter converter = new Converter();
27
28            // Add handler for conversion events
29            class EventListener implements ConversionEventListener
30            {
31                private EventSeverity eventsSeverity = EventSeverity.INFORMATION;
32
33                public EventSeverity getEventsSeverity() {
34                    return eventsSeverity;
35                }
36
37                @Override
38                public void conversionEvent(ConversionEvent event) {
39                    // Get the event's suggested severity
40                    EventSeverity severity = event.getSeverity();
41
42                    // Optionally the suggested severity can be changed according to
43                    // the requirements of your conversion process and, for example,
44                    // the event's category (e.Category).
45
46                    if (severity.ordinal() > eventsSeverity.ordinal())
47                        eventsSeverity = severity;
48
49                    // Report conversion event
50                    System.out.format("- %c %s: %s (%s%s)%n", severity.toString().charAt(0), event.getCategory(), event.getMessage(), event.getContext(), event.getPageNo() > 0 ? " on page " + event.getPageNo() : "");
51                }
52            }
53            EventListener el = new EventListener();
54
55            converter.addConversionEventListener(el);
56
57            // Convert the input document to PDF/A using the converter object
58            // and its conversion event handler
59            try (Document outDoc = converter.convert(analysisResult, inDoc, outStr))
60            {
61                // Check if critical conversion events occurred
62                switch (el.getEventsSeverity())
63                {
64                    case INFORMATION:
65                        System.out.println("Successfully converted document to " + outDoc.getConformance() + ".");
66                        break;
67
68                    case WARNING:
69                        System.out.println("Warnings occurred during the conversion of document to " + outDoc.getConformance() + ".");
70                        System.out.println("Check the output file to decide if the result is acceptable.");
71                        break;
72
73                    case ERROR:
74                        throw new Exception("Unable to convert document to " + conformance + " because of critical conversion events.");
75                }
76            }
77        }
78
79    }
80}
Download code sample
1# Open input document
2with io.FileIO(input_file_path, 'rb') as input_file:
3    input_stream_descriptor = StreamDescriptor(input_file)
4    input_document = pdf_document_open(input_stream_descriptor, None)
5    if not input_document:
6        print_error_message(f"Failed to open input document {input_document}.")
7        exit(1)
8
9    # Create validator to analyze PDF/A standard conformance of input document
10    analysis_options = pdfavalidation_analysisoptions_new()
11    conformance = PdfConformance.PDF_A2_B
12    pdfavalidation_analysisoptions_setconformance(analysis_options, conformance.value)
13    validator = pdfavalidation_validator_new()
14    analysis_result = pdfavalidation_validator_analyze(validator, input_document, analysis_options)
15    if not analysis_result:
16        print_error_message(f"Failed to analyze document {input_document}.")
17        exit(1)
18
19    if pdfavalidation_analysisresult_isconforming(analysis_result):
20        print(f"Document {input_file_path} conforms to {conformance.name}.")
21        exit(0)
22
23    # Create output stream for writing
24    with io.FileIO(output_file_path, 'wb+') as output_file:
25        output_stream_descriptor = StreamDescriptor(output_file)
26
27        # Convert the input document to PDF/A using the converter object
28        # and its conversion event handler
29        conversion_options = pdfaconversion_conversionoptions_new()
30        converter = pdfaconversion_converter_new()
31        callback = PdfAConversion_Converter_ConversionEventFunc(event_listener)
32        pdfaconversion_converter_addconversioneventhandler(converter, None, callback)
33        out_document = pdfaconversion_converter_convert(converter, analysis_result, input_document, output_stream_descriptor, conversion_options, None)
34        if not out_document:
35            print_error_message(f"Failed to convert document {input_file_path}.")
36            exit(1)
37
38        # Check if critical conversion events occurred
39        if events_severity == PdfAConversionEventSeverity.INFORMATION:
40            conformance = c_int()
41            pdf_document_getconformance(out_document, conformance)
42            print(f"Successfully converted document {input_file_path} to {PdfConformance(conformance.value).name}.")
43        elif events_severity == PdfAConversionEventSeverity.WARNING:
44            conformance = c_int()
45            pdf_document_getconformance(out_document, conformance)
46            print(f"Warnings occurred during the conversion of document {input_file_path} to {PdfConformance(conformance.value).name}.")
47            print(f"Check the output file {output_file_path} to decide if the result is acceptable.")
48        elif events_severity == PdfAConversionEventSeverity.ERROR:
49            print(f"Unable to convert document {input_file_path} to {PdfConformance(conformance.value).name} because of critical conversion events.")
50
51        pdf_document_close(out_document)
52    pdf_document_close(input_document)
53
1def event_listener(context, data_part, message, severity, category, code, context_info, page_no):
2    # severity is the event's suggested severity
3    # Optionally, the suggested severity can be changed according to
4    # the requirements of your conversion process and, for example,
5    # the event's category.
6
7    global events_severity
8
9    if PdfAConversionEventSeverity(severity) > events_severity:
10        events_severity = PdfAConversionEventSeverity(severity)
11
12    # Report conversion event
13    if severity == PdfAConversionEventSeverity.INFORMATION:
14        severity_char = 'I'
15    elif severity == PdfAConversionEventSeverity.WARNING:
16        severity_char = 'W'
17    else:
18        severity_char = 'E'
19
20    if page_no > 0:
21        print(f"- {severity_char} {PdfAValidationErrorCategory(category).name}: {message} ({context_info} on page {page_no})")
22    else:
23        print(f"- {severity_char} {PdfAValidationErrorCategory(category).name}: {message} ({context_info})")
24
Download code sample
1Sub ConvertIfNotConforming(inPath As String, outPath As String, conformance As Conformance)
2    ' Open input document
3    Using inStr = File.OpenRead(inPath)
4        Using inDoc = Document.Open(inStr)
5            ' Create the Validator object, and use the Conformance object to create
6            ' an AnalysisOptions object that controls the behavior of the Validator.
7            Dim validator = New Validator()
8            Dim analysisOptions = New AnalysisOptions() With {.conformance = conformance}
9
10            ' Run the analysis, and check the results.
11            ' Only proceed if document is not conforming.
12            Dim analysisResult = validator.Analyze(inDoc, analysisOptions)
13            If analysisResult.IsConforming Then
14                Console.WriteLine($"Document conforms to {inDoc.Conformance} already.")
15                Return
16            End If
17
18            ' Create a converter object
19            Dim converter = New Converter()
20
21            ' Add handler for conversion events
22            Dim eventsSeverity = EventSeverity.Information
23            AddHandler converter.ConversionEvent, Sub(s, e)
24                                                      ' Get the event's suggested severity
25                                                      Dim severity = e.Severity
26
27                                                      ' Optionally the suggested severity can be changed according to
28                                                      ' the requirements of your conversion process and, for example,
29                                                      ' the event's category (e.Category).
30
31                                                      If severity > eventsSeverity Then
32                                                          eventsSeverity = severity
33                                                      End If
34
35                                                      ' Report conversion event
36                                                      Console.WriteLine("- {0} {1}: {2} ({3}{4})",
37                                                        severity.ToString()(0), e.Category, e.Message, e.Context, If(e.PageNo > 0, " page " & e.PageNo, "")
38                                                      )
39                                                  End Sub
40
41            ' Create stream for output file
42            Using outStr = File.Create(outPath)
43                ' Convert the input document to PDF/A using the converter object
44                ' and its conversion event handler
45                Using outDoc = converter.Convert(analysisResult, inDoc, outStr)
46                    ' Check if critical conversion events occurred
47                    Select Case eventsSeverity
48                        Case EventSeverity.Information
49                            Console.WriteLine($"Successfully converted document to {outDoc.Conformance}.")
50                        Case EventSeverity.Warning
51                            Console.WriteLine($"Warnings occurred during the conversion of document to {outDoc.Conformance}.")
52                            Console.WriteLine($"Check the output file to decide if the result is acceptable.")
53                        Case EventSeverity.Error
54                            Throw New Exception($"Unable to convert document to {conformance} because of critical conversion events.")
55                    End Select
56                End Using
57            End Using
58        End Using
59    End Using
60End Sub
Download code sample

Create a ZUGFeRD invoice

1void EventListener(void* pContext, const char* szDataPart, const char* szMessage,
2                   TPdfToolsPdfAConversion_EventSeverity iSeverity, TPdfToolsPdfAConversion_EventCategory iCategory,
3                   TPdfToolsPdfAConversion_EventCode iCode, const char* szContext, int iPageNo)
4{
5    // iSeverity is the event's suggested severity
6    // Optionally the suggested severity can be changed according to
7    // the requirements of your conversion process and, for example,
8    // the event's category (e.Category).
9
10    if (iSeverity > iEventsSeverity)
11        iEventsSeverity = iSeverity;
12
13    // Report conversion event
14    TCHAR cSeverity = iSeverity == ePdfToolsPdfAConversion_EventSeverity_Information ? 'I'
15                      : ePdfToolsPdfAConversion_EventSeverity_Warning                ? 'W'
16                                                                                     : 'E';
17    if (iPageNo > 0)
18        _tprintf(_T("- %c %d: %s (%s on page %d)\n"), cSeverity, iCategory, szMessage, szContext, iPageNo);
19    else
20        _tprintf(_T("- %c %d: %s (%s)\n"), cSeverity, iCategory, szMessage, szContext);
21}
1void AddZugferdInvoice(const TCHAR* szInPath, const TCHAR* szInvoicePath, const TCHAR* szOutPath)
2{
3    TPdfToolsPdfAValidation_AnalysisOptions*   pAOpt          = NULL;
4    TPdfToolsPdfAValidation_Validator*         pValidator     = NULL;
5    TPdfToolsPdfAValidation_AnalysisResult*    pARes          = NULL;
6    TPdfToolsPdfAConversion_ConversionOptions* pConvOpt       = NULL;
7    TPdfToolsPdfAConversion_Converter*         pConv          = NULL;
8    TPdfToolsPdf_Document*                     pOutDoc        = NULL;
9    TPdfToolsPdf_Document*                     pInDoc         = NULL;
10    FILE*                                      pInStream      = NULL;
11    FILE*                                      pInvoiceStream = NULL;
12    FILE*                                      pOutStream     = NULL;
13
14    // Open input document
15    pInStream = _tfopen(szInPath, _T("rb"));
16    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInStream, _T("Failed to open the input file \"%s\" for reading.\n"), szInPath);
17    TPdfToolsSys_StreamDescriptor inDesc;
18    PdfToolsSysCreateFILEStreamDescriptor(&inDesc, pInStream, 0);
19    pInDoc = PdfToolsPdf_Document_Open(&inDesc, _T(""));
20    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInDoc, _T("Failed to open document \"%s\". %s (ErrorCode: 0x%08x).\n"), szInPath,
21                                     szErrBuf, PdfTools_GetLastError());
22
23    // Create validator to analyze PDF/A standard conformance of input document
24    pAOpt = PdfToolsPdfAValidation_AnalysisOptions_New();
25    // The conformance has to be set to PDF/A-3 when adding the XML invoice file
26    PdfToolsPdfAValidation_AnalysisOptions_SetConformance(pAOpt, ePdfToolsPdf_Conformance_PdfA3U);
27    pValidator = PdfToolsPdfAValidation_Validator_New();
28    pARes      = PdfToolsPdfAValidation_Validator_Analyze(pValidator, pInDoc, pAOpt);
29    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pARes, _T("Failed to analyze document. %s (ErrorCode: 0x%08x).\n"), szErrBuf,
30                                     PdfTools_GetLastError());
31
32    // Create output stream for writing
33    pOutStream = _tfopen(szOutPath, _T("wb+"));
34    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutStream, _T("Failed to create the output file \"%s\".\n"), szOutPath);
35    TPdfToolsSys_StreamDescriptor outDesc;
36    PdfToolsSysCreateFILEStreamDescriptor(&outDesc, pOutStream, 0);
37
38    // Create a converter object and add a conversion event handler
39    pConvOpt = PdfToolsPdfAConversion_ConversionOptions_New();
40    pConv    = PdfToolsPdfAConversion_Converter_New();
41    PdfToolsPdfAConversion_Converter_AddConversionEventHandlerA(
42        pConv, NULL, (TPdfToolsPdfAConversion_Converter_ConversionEventA)EventListener);
43
44    // Create invoice stream for reading
45    pInvoiceStream = _tfopen(szInvoicePath, _T("rb"));
46    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInvoiceStream, _T("Failed to open the invoice file \"%s\" for reading.\n"),
47                                     szInvoicePath);
48    TPdfToolsSys_StreamDescriptor invoiceDesc;
49    PdfToolsSysCreateFILEStreamDescriptor(&invoiceDesc, pInvoiceStream, 0);
50    // Add invoice XML file
51    PdfToolsPdfAConversion_Converter_AddInvoiceXml(pConv, ePdfToolsPdfAConversion_InvoiceType_Zugferd, &invoiceDesc,
52                                                   NULL);
53    // Convert the input document to PDF/A-3U
54    pOutDoc = PdfToolsPdfAConversion_Converter_Convert(pConv, pARes, pInDoc, &outDesc, pConvOpt, NULL);
55    GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutDoc, _T("Failed to convert document. %s (ErrorCode: 0x%08x).\n"), szErrBuf,
56                                     PdfTools_GetLastError());
57
58    // Check if critical conversion events occurred
59    switch (iEventsSeverity)
60    {
61    case ePdfToolsPdfAConversion_EventSeverity_Information:
62    {
63        TPdfToolsPdf_Conformance iOutConf;
64        PdfToolsPdf_Document_GetConformance(pOutDoc, &iOutConf);
65        printf("Successfully converted document to %s.\n", PdfToolsPdf_Conformance_ToStringA(iOutConf));
66        break;
67    }
68
69    case ePdfToolsPdfAConversion_EventSeverity_Warning:
70    {
71        TPdfToolsPdf_Conformance iOutConf;
72        PdfToolsPdf_Document_GetConformance(pOutDoc, &iOutConf);
73        printf("Warnings occurred during the conversion of document to %s.\n",
74               PdfToolsPdf_Conformance_ToStringA(iOutConf));
75        printf("Check the output file to decide if the result is acceptable.\n");
76        break;
77    }
78
79    case ePdfToolsPdfAConversion_EventSeverity_Error:
80    {
81        printf("Unable to convert document to PDF/A-3U because of critical conversion events.\n");
82        break;
83    }
84    }
85
86cleanup:
87    PdfToolsPdf_Document_Close(pOutDoc);
88    PdfTools_Release(pConv);
89    PdfTools_Release(pConvOpt);
90    PdfTools_Release(pARes);
91    PdfTools_Release(pValidator);
92    PdfTools_Release(pAOpt);
93    PdfToolsPdf_Document_Close(pInDoc);
94    if (pInStream)
95        fclose(pInStream);
96    if (pOutStream)
97        fclose(pOutStream);
98    if (pInvoiceStream)
99        fclose(pInvoiceStream);
100}
Download code sample
1static void AddZugferdInvoice(string inPath, string invoicePath, string outPath)
2{
3    // Open input document
4    using var inStr = File.OpenRead(inPath);
5    using var inDoc = Document.Open(inStr);
6
7    // Create the Validator object, and use the Conformance object to create
8    // an AnalysisOptions object that controls the behavior of the Validator.
9    var validator = new Validator();
10    // The conformance has to be set to PDF/A-3 when adding the XML invoice file
11    var analysisOptions = new AnalysisOptions() { Conformance = new Conformance(3, Conformance.PdfALevel.U) };
12
13    // Run the analysis
14    var analysisResult = validator.Analyze(inDoc, analysisOptions);
15
16    // Create a converter object
17    var converter = new Converter();
18
19    // Add invoice XML file
20    using var invoiceStr = File.OpenRead(invoicePath);
21    converter.AddInvoiceXml(InvoiceType.Zugferd, invoiceStr);
22
23    // Add handler for conversion events
24    var eventsSeverity = EventSeverity.Information;
25    converter.ConversionEvent += (s, e) =>
26    {
27        // Get the event's suggested severity
28        var severity = e.Severity;
29
30        // Optionally the suggested severity can be changed according to
31        // the requirements of your conversion process and, for example,
32        // the event's category (e.Category).
33
34        if (severity > eventsSeverity)
35            eventsSeverity = severity;
36
37        // Report conversion event
38        Console.WriteLine("- {0} {1}: {2} ({3}{4})",
39            severity.ToString()[0], e.Category, e.Message, e.Context, e.PageNo > 0 ? " page " + e.PageNo : ""
40        );
41    };
42
43    // Create stream for output file
44    using var outStr = File.Create(outPath);
45
46    // Convert the input document to PDF/A using the converter object
47    // and its conversion event handler
48    using var outDoc = converter.Convert(analysisResult, inDoc, outStr);
49
50    // Check if critical conversion events occurred
51    switch (eventsSeverity)
52    {
53        case EventSeverity.Information:
54            Console.WriteLine($"Successfully converted document to {outDoc.Conformance}.");
55            break;
56
57        case EventSeverity.Warning:
58            Console.WriteLine($"Warnings occurred during the conversion of document to {outDoc.Conformance}.");
59            Console.WriteLine($"Check the output file to decide if the result is acceptable.");
60            break;
61
62        case EventSeverity.Error:
63            throw new Exception($"Unable to convert document to PDF/A-3U because of critical conversion events.");
64    }
65}
Download code sample
1    private static void addZugferdInvoice(String inPath, String invoicePath, String outPath) throws Exception
2    {
3        // Open input document
4        try (FileStream inStr = new FileStream(inPath, FileStream.Mode.READ_ONLY);
5             Document inDoc = Document.open(inStr))
6        {
7            // Create the Validator object, and use the Conformance object to create
8            // an AnalysisOptions object that controls the behavior of the Validator.
9            Validator validator = new Validator();
10            AnalysisOptions analysisOptions = new AnalysisOptions();
11            // The conformance has to be set to PDF/A-3 when adding the XML invoice file
12            analysisOptions.setConformance(new Conformance(new Conformance.PdfAVersion(3, Conformance.PdfAVersion.Level.U)));
13
14            // Run the analysis
15            AnalysisResult analysisResult = validator.analyze(inDoc, analysisOptions);
16
17            // Create output stream
18            try (FileStream outStr = new FileStream(outPath, FileStream.Mode.READ_WRITE_NEW))
19            {
20                // Create a converter object
21                Converter converter = new Converter();
22
23                // Add invoice XML file
24                try (FileStream invoiceStr = new FileStream(invoicePath, FileStream.Mode.READ_ONLY))
25                {
26	                converter.addInvoiceXml(InvoiceType.ZUGFERD, invoiceStr);
27
28	                // Add handler for conversion events
29	                class EventListener implements ConversionEventListener
30	                {
31	                    private EventSeverity eventsSeverity = EventSeverity.INFORMATION;
32
33	                    public EventSeverity getEventsSeverity() {
34	                        return eventsSeverity;
35	                    }
36
37	                    @Override
38	                    public void conversionEvent(ConversionEvent event) {
39	                        // Get the event's suggested severity
40	                        EventSeverity severity = event.getSeverity();
41
42	                        // Optionally the suggested severity can be changed according to
43	                        // the requirements of your conversion process and, for example,
44	                        // the event's category (e.Category).
45
46	                        if (severity.ordinal() > eventsSeverity.ordinal())
47	                            eventsSeverity = severity;
48
49	                        // Report conversion event
50	                        System.out.format("- %c %s: %s (%s%s)%n", severity.toString().charAt(0), event.getCategory(), event.getMessage(), event.getContext(), event.getPageNo() > 0 ? " on page " + event.getPageNo() : "");
51	                    }
52	                }
53	                EventListener el = new EventListener();
54
55	                converter.addConversionEventListener(el);
56
57	                // Convert the input document to PDF/A using the converter object
58	                // and its conversion event handler
59	                try (Document outDoc = converter.convert(analysisResult, inDoc, outStr))
60	                {
61	                    // Check if critical conversion events occurred
62	                    switch (el.getEventsSeverity())
63	                    {
64	                        case INFORMATION:
65	                            System.out.println("Successfully converted document to " + outDoc.getConformance() + ".");
66	                            break;
67
68	                        case WARNING:
69	                            System.out.println("Warnings occurred during the conversion of document to " + outDoc.getConformance() + ".");
70	                            System.out.println("Check the output file to decide if the result is acceptable.");
71	                            break;
72
73	                        case ERROR:
74	                            throw new Exception("Unable to convert document to PDF/A-3U because of critical conversion events.");
75	                    }
76	                }
77                }
78            }
79        }
80    }
Download code sample
1Sub AddZugferdInvoice(inPath As String, invoicePath As String, outPath As String)
2    ' Open input document
3    Using inStr = File.OpenRead(inPath)
4        Using inDoc = Document.Open(inStr)
5
6            ' Create the Validator object, and use the Conformance object to create
7            ' an AnalysisOptions object that controls the behavior of the Validator.
8            Dim validator = New Validator()
9            ' The conformance has to be set to PDF/A-3 when adding the XML invoice file
10            Dim analysisOptions = New AnalysisOptions() With {.Conformance = New Conformance(3, Conformance.PdfALevel.U)}
11
12            ' Run the analysis
13            Dim analysisResult = validator.Analyze(inDoc, analysisOptions)
14
15            ' Create a converter object
16            Dim converter = New Converter()
17
18            ' Add invoice XML file
19            Using invoiceStr = File.OpenRead(invoicePath)
20                converter.AddInvoiceXml(InvoiceType.Zugferd, invoiceStr)
21
22                ' Add handler for conversion events
23                Dim eventsSeverity = EventSeverity.Information
24                AddHandler converter.ConversionEvent, Sub(s, e)
25                                                          ' Get the event's suggested severity
26                                                          Dim severity = e.Severity
27
28                                                          ' Optionally the suggested severity can be changed according to
29                                                          ' the requirements of your conversion process and, for example,
30                                                          ' the event's category (e.Category).
31
32                                                          If severity > eventsSeverity Then
33                                                              eventsSeverity = severity
34                                                          End If
35
36                                                          ' Report conversion event
37                                                          Console.WriteLine("- {0} {1}: {2} ({3}{4})", severity.ToString()(0), e.Category, e.Message, e.Context, If(e.PageNo > 0, " page " & e.PageNo, ""))
38                                                      End Sub
39
40                ' Create stream for output file
41                Using outStr = File.Create(outPath)
42
43                    ' Convert the input document to PDF/A using the converter object
44                    ' and its conversion event handler
45                    Using outDoc = converter.Convert(analysisResult, inDoc, outStr)
46
47                        ' Check if critical conversion events occurred
48                        Select Case eventsSeverity
49                            Case EventSeverity.Information
50                                Console.WriteLine($"Successfully converted document to {outDoc.Conformance}.")
51                            Case EventSeverity.Warning
52                                Console.WriteLine($"Warnings occurred during the conversion of document to {outDoc.Conformance}.")
53                                Console.WriteLine($"Check the output file to decide if the result is acceptable.")
54                            Case EventSeverity.Error
55                                Throw New Exception($"Unable to convert document to PDF/A-3U because of critical conversion events.")
56                        End Select
57                    End Using
58                End Using
59            End Using
60        End Using
61    End Using
62End Sub
Download code sample

Converting documents to rasterized images

Convert PDF to image

1// Open input document
2pInStream = _tfopen(szInPath, _T("rb"));
3GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInStream, _T("Failed to open the input file \"%s\" for reading.\n"), szInPath);
4TPdfToolsSys_StreamDescriptor inDesc;
5PdfToolsSysCreateFILEStreamDescriptor(&inDesc, pInStream, 0);
6pInDoc = PdfToolsPdf_Document_Open(&inDesc, _T(""));
7GOTO_CLEANUP_IF_NULL_PRINT_ERROR(
8    pInDoc, _T("Failed to create a document from the input file \"%s\". %s (ErrorCode: 0x%08x).\n"), szInPath,
9    szErrorBuff, PdfTools_GetLastError());
10
11// Create output stream for writing
12pOutStream = _tfopen(szOutPath, _T("wb+"));
13GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutStream, _T("Failed to open the output file \"%s\" for writing.\n"), szOutPath);
14TPdfToolsSys_StreamDescriptor outDesc;
15PdfToolsSysCreateFILEStreamDescriptor(&outDesc, pOutStream, 0);
16
17// Create the profile that defines the conversion parameters.
18// The Archive profile converts PDF documents to TIFF images for archiving.
19pProfile = (TPdfToolsPdf2ImageProfiles_Profile*)PdfToolsPdf2ImageProfiles_Archive_New();
20
21// Optionally the profile's parameters can be changed according to the
22// requirements of your conversion process.
23
24// Convert the PDF document to an image document
25pConverter = PdfToolsPdf2Image_Converter_New();
26pOutDoc =
27    (TPdfToolsImage_Document*)PdfToolsPdf2Image_Converter_ConvertDocument(pConverter, pInDoc, &outDesc, pProfile);
28GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutDoc, _T("The processing has failed. (ErrorCode: 0x%08x).\n"),
29                                 PdfTools_GetLastError());
30
Download code sample
1private static void Pdf2Image(string inPath, string outPath)
2{
3    // Open input document
4    using var inStr = File.OpenRead(inPath);
5    using var inDoc = Document.Open(inStr);
6
7    // Create the profile that defines the conversion parameters.
8    // The Archive profile converts PDF documents to TIFF images for archiving.
9    var profile = new Profiles.Archive();
10
11    // Optionally the profile's parameters can be changed according to the 
12    // requirements of your conversion process.
13
14    // Create output stream
15    using var outStr = File.Create(outPath);
16
17    // Convert the PDF document to an image document
18    using var outDoc = new Converter().ConvertDocument(inDoc, outStr, profile);
19}
Download code sample
1private static void pdf2Image(String inPath, String outPath) throws Exception
2{
3    // Create the profile that defines the conversion parameters.
4    // The Archive profile converts PDF documents to TIFF images for archiving.
5    Archive profile = new Archive();
6
7    // Optionally the profile's parameters can be changed according to the 
8    // requirements of your conversion process.
9
10    try (
11        // Open input document
12        FileStream inStr = new FileStream(inPath, FileStream.Mode.READ_ONLY);
13        Document inDoc = Document.open(inStr);
14
15        // Create output stream
16        FileStream outStream = new FileStream(outPath, FileStream.Mode.READ_WRITE_NEW);
17
18        // Convert the PDF document to an image document
19        com.pdftools.image.Document outDoc = new Converter().convertDocument(inDoc, outStream, profile))
20    {
21    }
22}
Download code sample
1# Open input document
2with io.FileIO(input_pdf_path, 'rb') as input_stream:
3    input_stream_descriptor = StreamDescriptor(input_stream)
4    input_document = pdf_document_open(input_stream_descriptor, None)
5    if not input_document:
6        print_error_message(f"Failed to create a document from the input PDF {input_pdf_path}.")
7        exit(1)
8
9    # Create output stream for writing
10    with io.FileIO(output_image_path, 'wb+') as output_stream:
11        output_stream_descriptor = StreamDescriptor(output_stream)
12
13        # Create the profile that defines the conversion parameters.
14        # The Archive profile converts PDF documents to TIFF images for archiving.
15        profile = pdf2imageprofiles_archive_new()
16
17        # Optionally the profile's parameters can be changed according to the
18        # requirements of your conversion process.
19
20        # Convert the PDF document to an image document
21        converter = pdf2image_converter_new()
22        out_image = pdf2image_converter_convertdocument(converter, input_document, output_stream_descriptor, profile)
23        if not out_image:
24            print_error_message(f"Converting PDF to image has failed.")
25            exit(1)
26
27        image_document_close(out_image)
28    pdf_document_close(input_document)
29
Download code sample
1Private Sub Pdf2Image(inPath As String, outPath As String)
2    ' Open input document
3    Using inStr = File.OpenRead(inPath)
4        Using inDoc = Document.Open(inStr)
5
6            ' Create the profile that defines the conversion parameters.
7            ' The Archive profile converts PDF documents to TIFF images for archiving.
8            Dim profile = New Profiles.Archive()
9
10            ' Optionally the profile's parameters can be changed according to the 
11            ' requirements of your conversion process.
12
13            ' Create output stream
14            Using outStr = File.Create(outPath)
15
16                ' Convert the PDF document to an image document
17                Using outDoc = New Converter().ConvertDocument(inDoc, outStr, profile)
18                End Using
19            End Using
20        End Using
21    End Using
22End Sub
Download code sample

Converting images to PDF documents

Convert an image to an accessible PDF/A document

1private static void Image2Pdf(string inPath, string alternateText, string outPath)
2{
3    // Open image document
4    using var inStr = File.OpenRead(inPath);
5    using var inDoc = Document.Open(inStr);
6
7    // Create the profile that defines the conversion parameters.
8    // The Archive profile converts images to PDF/A documents for archiving.
9    var profile = new Profiles.Archive();
10
11    // Set conformance of output document to PDF/A-2a
12    profile.Conformance = new Conformance(2, Conformance.PdfALevel.A);
13
14    // For PDF/A level A, an alternate text is required for each page of the image.
15    // This is optional for other PDF/A levels, e.g. PDF/A-2b.
16    profile.Language = "en";
17    profile.AlternateText.Add(alternateText);
18
19    // Optionally other profile parameters can be changed according to the 
20    // requirements of your conversion process.
21
22    // Create output stream
23    using var outStr = File.Create(outPath);
24
25    // Convert the image to a tagged PDF/A document
26    using var outDoc = new Converter().Convert(inDoc, outStr, profile);
27}
Download code sample
1private static void image2Pdf(String inPath, String alternateText, String outPath) throws Exception
2{
3    // Create the profile that defines the conversion parameters.
4    // The Archive profile converts images to PDF/A documents for archiving.
5    Archive profile = new Archive();
6
7    // Set conformance of output document to PDF/A-2a
8    profile.setConformance(new Conformance(new Conformance.PdfAVersion(2, Level.A)));
9
10    // For PDF/A level A, an alternate text is required for each page of the image.
11    // This is optional for other PDF/A levels, e.g. PDF/A-2b.
12    profile.setLanguage("en");
13    profile.getAlternateText().add(alternateText);
14
15    // Optionally other profile parameters can be changed according to the 
16    // requirements of your conversion process.
17
18    try (
19        // Open input document
20        FileStream inStr = new FileStream(inPath, FileStream.Mode.READ_ONLY);
21        Document inDoc = Document.open(inStr);
22
23        // Create output stream
24        FileStream outStream = new FileStream(outPath, FileStream.Mode.READ_WRITE_NEW);
25
26        // Convert the image to a tagged PDF/A document
27        com.pdftools.pdf.Document outDoc = new Converter().convert(inDoc, outStream, profile))
28    {
29    }
30}
Download code sample
1# Open input document
2with io.FileIO(input_file_path, 'rb') as input_file:
3    input_stream_descriptor = StreamDescriptor(input_file)
4    input_image = image_document_open(input_stream_descriptor)
5    if not input_image:
6        print_error_message(f"Failed to open input image {input_file_path}.")
7        exit(1)
8
9    # Create output stream for writing
10    with io.FileIO(output_file_path, 'wb+') as output_file:
11        output_stream_descriptor = StreamDescriptor(output_file)
12
13        # Create the profile that defines the conversion parameters.
14        # The Archive profile converts images to PDF/A documents for archiving.
15        profile = image2pdfprofiles_archive_new()
16
17        # Set conformance of output document to PDF/A-2a
18        image2pdfprofiles_archive_setconformance(profile, PdfConformance.PDF_A2_A.value)
19
20        # For PDF/A level A, an alternate text is required for each page of the image.
21        # This is optional for other PDF/A levels, e.g. PDF/A-2b.
22        image2pdfprofiles_archive_setlanguage(profile, "en")
23        alternate_text_list = image2pdfprofiles_archive_getalternatetext(profile)
24        stringlist_add(alternate_text_list, alternate_text)
25
26        # Optionally other profile parameters can be changed according to the 
27        # requirements of your conversion process.
28
29        converter = image2pdf_converter_new()
30        out_document = image2pdf_converter_convert(converter, input_image, output_stream_descriptor, profile, None)
31        if not out_document:
32            print_error_message(f"Error while converting {input_file_path}.")
33            exit(1)
34
35        pdf_document_close(out_document)
36    image_document_close(input_image)
37
38
Download code sample
1Private Sub Image2Pdf(inPath As String, alternateText As String, outPath As String)
2    ' Open image document
3    Using inStr = File.OpenRead(inPath)
4        Using inDoc = Document.Open(inStr)
5
6            ' Create the profile that defines the conversion parameters.
7            ' The Archive profile converts images to PDF/A documents for archiving.
8            Dim profile = New Profiles.Archive()
9
10            ' Set conformance of output document to PDF/A-2a
11            profile.Conformance = New Conformance(2, Conformance.PdfALevel.A)
12
13            ' For PDF/A level A, an alternate text is required for each page of the image.
14            ' This is optional for other PDF/A levels, e.g. PDF/A-2b.
15            profile.Language = "en"
16            profile.AlternateText.Add(alternateText)
17
18            ' Optionally other profile parameters can be changed according to the 
19            ' requirements of your conversion process.
20
21            ' Create output stream
22            Using outStr = File.Create(outPath)
23
24                ' Convert the image to a tagged PDF/A document
25                Using outDoc = New Converter().Convert(inDoc, outStr, profile)
26                End Using
27            End Using
28        End Using
29    End Using
30End Sub
Download code sample

Convert image to PDF

1// Open input document
2pInStream = _tfopen(szInPath, _T("rb"));
3GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInStream, _T("Failed to open the input file \"%s\" for reading.\n"), szInPath);
4TPdfToolsSys_StreamDescriptor inDesc;
5PdfToolsSysCreateFILEStreamDescriptor(&inDesc, pInStream, 0);
6pInDoc = PdfToolsImage_Document_Open(&inDesc);
7GOTO_CLEANUP_IF_NULL_PRINT_ERROR(
8    pInDoc, _T("Failed to create a document from the input file \"%s\". %s (ErrorCode: 0x%08x).\n"), szInPath,
9    szErrorBuff, PdfTools_GetLastError());
10
11// Create output stream for writing
12pOutStream = _tfopen(szOutPath, _T("wb+"));
13GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutStream, _T("Failed to open the output file \"%s\" for writing.\n"), szOutPath);
14TPdfToolsSys_StreamDescriptor outDesc;
15PdfToolsSysCreateFILEStreamDescriptor(&outDesc, pOutStream, 0);
16
17// Create the profile that defines the conversion parameters.
18// The Default profile converts images to PDF documents.
19pProfile = (TPdfToolsImage2PdfProfiles_Profile*)PdfToolsImage2PdfProfiles_Default_New();
20
21// Convert the image to a PDF document
22pConverter = PdfToolsImage2Pdf_Converter_New();
23pOutDoc = (TPdfToolsPdf_Document*)PdfToolsImage2Pdf_Converter_Convert(pConverter, pInDoc, &outDesc, pProfile, NULL);
24GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutDoc, _T("The processing has failed. (ErrorCode: 0x%08x).\n"),
25                                 PdfTools_GetLastError());
26
Download code sample
1private static void Image2Pdf(string inPath, string outPath)
2{
3    // Open image document
4    using var inStr = File.OpenRead(inPath);
5    using var inDoc = Document.Open(inStr);
6
7    // Create the profile that defines the conversion parameters.
8    // The Default profile converts images to PDF documents.
9    var profile = new Profiles.Default();
10
11    // Optionally, the profile's parameters can be changed according to the 
12    // requirements of your conversion process.
13
14    // Create output stream
15    using var outStr = File.Create(outPath);
16
17    // Convert the image to a PDF document
18    using var outDoc = new Converter().Convert(inDoc, outStr, profile);
19}
Download code sample
1private static void image2Pdf(String inPath, String outPath) throws Exception
2{
3    // Create the profile that defines the conversion parameters.
4    // The Default profile converts images to PDF documents.
5    Default profile = new Default();
6
7    // Optionally, the profile's parameters can be changed according to the 
8    // requirements of your conversion process.
9
10    try (
11        // Open input document
12        FileStream inStr = new FileStream(inPath, FileStream.Mode.READ_ONLY);
13        Document inDoc = Document.open(inStr);
14
15        // Create output stream
16        FileStream outStream = new FileStream(outPath, FileStream.Mode.READ_WRITE_NEW);
17
18        // Convert the image to a PDF document
19        com.pdftools.pdf.Document outDoc = new Converter().convert(inDoc, outStream, profile))
20    {
21    }
22}
Download code sample
1Private Sub Image2Pdf(inPath As String, outPath As String)
2    ' Open image document
3    Using inStr = File.OpenRead(inPath)
4        Using inDoc = Document.Open(inStr)
5
6            ' Create the profile that defines the conversion parameters.
7            ' The Default profile converts images to PDF documents.
8            Dim profile = New Profiles.Default()
9
10            ' Optionally, the profile's parameters can be changed according to the 
11            ' requirements of your conversion process.
12
13            ' Create output stream
14            Using outStr = File.Create(outPath)
15
16                ' Convert the image to a PDF document
17                Using outDoc = New Converter().Convert(inDoc, outStr, profile)
18                End Using
19            End Using
20        End Using
21    End Using
22End Sub
Download code sample

Convert multiple images to a PDF

1private static void Images2Pdf(IEnumerable<string> inPaths, string outPath)
2{
3    var streams = new List<FileStream>();
4    var images = new DocumentList();
5    try
6    {
7        // Open input images and store in list
8        foreach (var inPath in inPaths)
9        {
10            var stream = File.OpenRead(inPath);
11            streams.Add(stream);
12            images.Add(Document.Open(stream));
13        }
14
15        // Create the profile that defines the conversion parameters.
16        var profile = new Profiles.Default();
17
18        // Optionally the profile's parameters can be changed according to the 
19        // requirements of your conversion process.
20        // Create output stream
21        using var outStream = File.Create(outPath);
22        using var outPdf = new Converter().ConvertMultiple(images, outStream, profile);
23    }
24    finally
25    {
26        foreach (var image in images)
27            image.Dispose();
28        foreach (var stream in streams)
29            stream.Dispose();
30    }
31}
Download code sample
1private static void Images2Pdf(String[] inPaths, String outPath) throws Exception
2{
3    // Create the profile that defines the conversion parameters.
4    Default profile = new Default();
5
6    List<FileStream> streams = new ArrayList<>();
7    DocumentList images = new DocumentList();
8
9    // Optionally the profile's parameters can be changed according to the 
10    // requirements of your conversion process.
11    try {
12        // Open input documents
13        for (String inPath : inPaths) {
14            FileStream stream = new FileStream(inPath, FileStream.Mode.READ_ONLY);
15            streams.add(stream);
16            images.add(Document.open(stream));
17        }
18
19        try (
20            // Create output stream
21            FileStream outStream = new FileStream(outPath, FileStream.Mode.READ_WRITE_NEW);
22            // Convert the image to a PDF document
23            com.pdftools.pdf.Document outDoc = new Converter().convertMultiple(images, outStream, profile)) {
24            }
25    }
26    finally {
27        for (Document image : images) 
28            image.close();
29        for (FileStream stream : streams)
30            stream.close();
31    }
32}
Download code sample
1 # Loop over all the image paths and store opened images into list
2 stream_list = []
3 images = image_documentlist_new()
4 for image_path in input_image_paths:
5     input_file = open(image_path, 'rb')
6     input_stream_descriptor = StreamDescriptor(input_file)
7     stream_list.append(input_stream_descriptor)
8     input_image = image_document_open(input_stream_descriptor)
9     if not input_image:
10         print_error_message(f"Failed to open input image {image_path}.")
11         exit(1)                
12     image_documentlist_add(images, input_image)
13
14# Create output stream for writing
15 with io.FileIO(output_file_path, 'wb+') as output_file:
16     output_stream_descriptor = StreamDescriptor(output_file)
17
18     # Create the profile that defines the conversion parameters.
19     profile = image2pdfprofiles_default_new()
20
21     converter = image2pdf_converter_new()
22
23     # Create output PDF
24     out_document = image2pdf_converter_convertmultiple(converter, images, output_stream_descriptor, profile, None)
25     if not out_document:
26         print_error_message(f"Error while converting images to Pdf.")
27         exit(1)
28
29     pdf_document_close(out_document)
30
Download code sample
1Private Sub Images2Pdf(inPaths As IEnumerable(Of String), outPath As String)
2    Dim streams = New List(Of FileStream)()
3    Dim images = New DocumentList()
4    Try
5        ' Open input images and store in list
6        For Each inPath In inPaths
7            Dim stream = File.OpenRead(inPath)
8            streams.Add(stream)
9            images.Add(Document.Open(stream))
10        Next
11
12        ' Create the profile that defines the conversion parameters.
13        Dim profile = New Profiles.Default()
14
15        ' Optionally the profile's parameters can be changed according to the 
16        ' requirements of your conversion process.
17        ' Create output stream
18        Using outStream = File.Create(outPath)
19            Using outPdf = New Converter().ConvertMultiple(images, outStream, profile)
20            End Using
21        End Using
22    Finally
23        For Each item In images
24            item.Dispose()
25        Next
26        For Each stream In streams
27            stream.Dispose()
28        Next
29    End Try
30End Sub
Download code sample

Encrypt documents

Decrypt an encrypted PDF

1// Use password to open encrypted input document
2pInStream = _tfopen(szInPath, _T("rb"));
3GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInStream, _T("Failed to open the input file \"%s\" for reading.\n"), szInPath);
4TPdfToolsSys_StreamDescriptor inDesc;
5PdfToolsSysCreateFILEStreamDescriptor(&inDesc, pInStream, 0);
6pInDoc = PdfToolsPdf_Document_Open(&inDesc, szPassword);
7GOTO_CLEANUP_IF_NULL_PRINT_ERROR(
8    pInDoc, _T("Failed to create a document from the input file \"%s\". %s (ErrorCode: 0x%08x).\n"), szInPath,
9    szErrorBuff, PdfTools_GetLastError());
10
11// Create output stream for writing
12pOutStream = _tfopen(szOutPath, _T("wb+"));
13GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutStream, _T("Failed to open the output file \"%s\" for writing.\n"), szOutPath);
14TPdfToolsSys_StreamDescriptor outDesc;
15PdfToolsSysCreateFILEStreamDescriptor(&outDesc, pOutStream, 0);
16
17// Check if input file is encrypted
18BOOL bIsGetPermissionsSuccessful = PdfToolsPdf_Document_GetPermissions(pInDoc, &iPermissions);
19if (!bIsGetPermissionsSuccessful)
20{
21    if (PdfTools_GetLastError() == 0)
22    {
23        _tprintf(_T("Validation failed, input file \"%s\" is not encrypted.\n"), szInPath);
24        iRet = 1;
25        goto cleanup;
26    }
27    else
28    {
29        nBufSize = PdfTools_GetLastErrorMessage(NULL, 0);
30        PdfTools_GetLastErrorMessage(szErrorBuff, MIN(ARRAY_SIZE(szErrorBuff), nBufSize));
31        _tprintf(_T("Failed to get permissions for input file \"%s\", error %s \n"), szInPath, szErrorBuff);
32        iRet = 1;
33        goto cleanup;
34    }
35}
36
37// Set encryption options
38pOptions = PdfToolsSign_OutputOptions_New();
39
40// Set encryption parameters to no encryption
41PdfToolsPdf_OutputOptions_SetEncryption((TPdfToolsPdf_OutputOptions*)pOptions, NULL);
42
43// Allow removal of signatures. Otherwise the Encryption property is ignored for signed input documents
44// (see warning category Sign.WarningCategory.SignedDocEncryptionUnchanged).
45PdfToolsSign_OutputOptions_SetRemoveSignatures(pOptions, ePdfToolsSign_SignatureRemoval_Signed);
46
47// Decrypt the document
48pSigner = PdfToolsSign_Signer_New();
49pOutDoc = PdfToolsSign_Signer_Process(pSigner, pInDoc, &outDesc, pOptions, NULL);
50GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutDoc, _T("The processing has failed. (ErrorCode: 0x%08x).\n"),
51                                 PdfTools_GetLastError());
52
53
Download code sample
1static void Decrypt(string password, string inPath, string outPath)
2{
3    // Use password to open encrypted input document
4    using var inStr = File.OpenRead(inPath);
5    using var inDoc = Document.Open(inStr, password);
6
7    if (inDoc.Permissions == null)
8        throw new Exception("Input file is not encrypted.");
9
10    // Create stream for output file
11    using var outStr = File.Create(outPath);
12
13    // Set encryption options
14    var outputOptions = new Sign.OutputOptions()
15    {
16        // Set encryption parameters to no encryption
17        Encryption = null,
18        // Allow removal of signatures. Otherwise the Encryption property is ignored for signed input documents
19        // (see warning category Sign.WarningCategory.SignedDocEncryptionUnchanged).
20        RemoveSignatures = Sign.SignatureRemoval.Signed,
21    };
22
23    // Decrypt the document
24    using var outDoc = new Sign.Signer().Process(inDoc, outStr, outputOptions);
25}
Download code sample
1private static void decrypt(String password, String inPath, String outPath) throws Exception
2{
3    try (
4        // Use password to open encrypted input document
5        FileStream inStr = new FileStream(inPath, FileStream.Mode.READ_ONLY);
6        Document inDoc = Document.open(inStr, password))
7    {
8        if (inDoc.getPermissions() == null)
9            throw new Exception("Input file is not encrypted.");
10
11        // Set encryption options
12        OutputOptions outputOptions = new OutputOptions();
13
14        // Set encryption parameters to no encryption
15        outputOptions.setEncryption(null);
16
17        // Allow removal of signatures. Otherwise the Encryption property is ignored for signed input documents
18        // (see warning category WarningCategory.SIGNED_DOC_ENCRYPTION_UNCHANGED).
19        outputOptions.setRemoveSignatures(SignatureRemoval.SIGNED);
20
21        try(
22            // Create output stream
23            FileStream outStr = new FileStream(outPath, FileStream.Mode.READ_WRITE_NEW);
24
25            // Decrypt the document
26            Document outDoc = new Signer().process(inDoc, outStr, outputOptions))
27        {
28        }
29    }
30}
Download code sample
1# Use password to open encrypted input document
2with io.FileIO(input_file_path, 'rb') as input_file:
3    input_stream_descriptor = StreamDescriptor(input_file)
4    input_document = pdf_document_open(input_stream_descriptor, password)
5    if not input_document:
6        print_error_message("Failed to open input document.")
7        exit(1)
8
9    # Create output stream for writing
10    with io.FileIO(output_file_path, 'wb+') as output_file:
11        output_stream_descriptor = StreamDescriptor(output_file)
12
13        # Check if input file is encrypted
14        permission = c_int(PdfPermission.NONE.value)
15        isGetPermissionSuccessful = pdf_document_getpermissions(input_document, permission)
16        if not isGetPermissionSuccessful:
17            if getlasterror() == ErrorCode.SUCCESS:
18                print(f"Validation failed, input file {input_file_path} is not encrypted.")
19                exit(1)
20            else:
21                print_error_message(f"Failed to get permissions for input file {input_file_path}.")
22                exit(1)
23
24        # Set encryption options
25        options = sign_outputoptions_new()
26
27        # Set encryption parameters to no encryption
28        pdf_outputoptions_setencryption(options, None)
29
30        # Allow removal of signatures. Otherwise the Encryption property is ignored for signed input documents
31        # (see warning category SignWarningCategory.SIGNED_DOC_ENCRYPTION_UNCHANGED).
32        sign_outputoptions_setremovesignatures(options, SignSignatureRemoval.SIGNED.value)
33
34        # Decrypt the document
35        signer = sign_signer_new()
36        out_document = sign_signer_process(signer, input_document, output_stream_descriptor, options, None)
37        if not out_document:
38            print_error_message("The processing has failed.")
39            exit(1)  
40
41        pdf_document_close(out_document)
42    pdf_document_close(input_document)
43
Download code sample
1Sub Decrypt(password As String, inPath As String, outPath As String)
2    ' Use password to open encrypted input document
3    Using inStr = File.OpenRead(inPath)
4        Using inDoc = Document.Open(inStr, password)
5
6            If inDoc.Permissions Is Nothing Then
7                Throw New Exception("Input file is not encrypted.")
8            End If
9
10            ' Create stream for output file
11            Using outStr = File.Create(outPath)
12
13                ' Set encryption options
14                Dim outputOptions = New Sign.OutputOptions() With {
15                    .Encryption = Nothing,
16                    .RemoveSignatures = Sign.SignatureRemoval.Signed
17                }
18
19                ' Decrypt the document
20                Using outDoc = New Sign.Signer().Process(inDoc, outStr, outputOptions)
21                End Using
22            End Using
23        End Using
24    End Using
25End Sub
Download code sample

Encrypted PDF

1// Open input document
2pInStream = _tfopen(szInPath, _T("rb"));
3GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInStream, _T("Failed to open the input file \"%s\" for reading.\n"), szInPath);
4TPdfToolsSys_StreamDescriptor inDesc;
5PdfToolsSysCreateFILEStreamDescriptor(&inDesc, pInStream, 0);
6pInDoc = PdfToolsPdf_Document_Open(&inDesc, _T(""));
7GOTO_CLEANUP_IF_NULL_PRINT_ERROR(
8    pInDoc, _T("Failed to create a document from the input file \"%s\". %s (ErrorCode: 0x%08x).\n"), szInPath,
9    szErrorBuff, PdfTools_GetLastError());
10
11// Create output stream for writing
12pOutStream = _tfopen(szOutPath, _T("wb+"));
13GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutStream, _T("Failed to open the output file \"%s\" for writing.\n"), szOutPath);
14TPdfToolsSys_StreamDescriptor outDesc;
15PdfToolsSysCreateFILEStreamDescriptor(&outDesc, pOutStream, 0);
16
17// Set encryption options
18pOptions = PdfToolsSign_OutputOptions_New();
19
20// Set a user password that will be required to open the document.
21// Note that this will remove PDF/A conformance of input files (see warning category
22// ePdfToolsSign_WarningCategory_PdfARemoved)
23pEncryption = PdfToolsPdf_Encryption_New(szPassword, NULL, ePdfToolsPdf_Permission_All);
24PdfToolsPdf_OutputOptions_SetEncryption((TPdfToolsPdf_OutputOptions*)pOptions, pEncryption);
25
26// Allow removal of signatures. Otherwise the Encryption property is ignored for signed input documents
27// (see warning category ePdfToolsSign_WarningCategory_SignedDocEncryptionUnchanged).
28PdfToolsSign_OutputOptions_SetRemoveSignatures(pOptions, ePdfToolsSign_SignatureRemoval_Signed);
29
30// Encrypt the document
31pSigner = PdfToolsSign_Signer_New();
32pOutDoc = PdfToolsSign_Signer_Process(pSigner, pInDoc, &outDesc, pOptions, NULL);
33GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutDoc, _T("The processing has failed. (ErrorCode: 0x%08x).\n"),
34                                 PdfTools_GetLastError());
35
36
Download code sample
1static void Encrypt(string password, string inPath, string outPath)
2{
3    // Open input document
4    using var inStr = File.OpenRead(inPath);
5    using var inDoc = Document.Open(inStr);
6
7    // Create stream for output file
8    using var outStr = File.Create(outPath);
9
10    // Set encryption options
11    var outputOptions = new Sign.OutputOptions()
12    {
13        // Set a user password that will be required to open the document.
14        // Note that this will remove PDF/A conformance of input files (see warning category Sign.WarningCategory.PdfARemoved)
15        Encryption = new Encryption(password, null, Permission.All),
16        // Allow removal of signatures. Otherwise the Encryption property is ignored for signed input documents
17        // (see warning category Sign.WarningCategory.SignedDocEncryptionUnchanged).
18        RemoveSignatures = Sign.SignatureRemoval.Signed,
19    };
20
21    // Encrypt the document
22    using var outDoc = new Sign.Signer().Process(inDoc, outStr, outputOptions);
23}
Download code sample
1private static void encrypt(String password, String inPath, String outPath) throws Exception
2{
3    try (
4        // Open input document
5        FileStream inStr = new FileStream(inPath, FileStream.Mode.READ_ONLY);
6        Document inDoc = Document.open(inStr))
7    {
8        // Set encryption options
9        OutputOptions outputOptions = new OutputOptions();
10
11        // Set a user password that will be required to open the document.
12        // Note that this will remove PDF/A conformance of input files (see warning category WarningCategory.PDF_A_REMOVED)
13        outputOptions.setEncryption(new Encryption(password, null, Permission.ALL));
14
15        // Allow removal of signatures. Otherwise the Encryption property is ignored for signed input documents
16        // (see warning category WarningCategory.SIGNED_DOC_ENCRYPTION_UNCHANGED).
17        outputOptions.setRemoveSignatures(SignatureRemoval.SIGNED);
18
19        try(
20            // Create output stream
21            FileStream outStr = new FileStream(outPath, FileStream.Mode.READ_WRITE_NEW);
22
23            // Encrypt the document
24            Document outDoc = new Signer().process(inDoc, outStr, outputOptions))
25        {
26        }
27    }
28}
Download code sample
1# Open input document
2with io.FileIO(input_file_path, 'rb') as input_file:
3    input_stream_descriptor = StreamDescriptor(input_file)
4    input_document = pdf_document_open(input_stream_descriptor, password)
5    if not input_document:
6        print_error_message("Failed to open input document.")
7        exit(1)
8
9    # Create output stream for writing
10    with io.FileIO(output_file_path, 'wb+') as output_file:
11        output_stream_descriptor = StreamDescriptor(output_file)
12
13        # Set encryption options
14        options = sign_outputoptions_new()
15
16        # Set a user password that will be required to open the document.
17        # Note that this will remove PDF/A conformance of input files (see warning category
18        # SignWarningCategory.PDF_A_REMOVED)
19        encryption = pdf_encryption_new(password, None, PdfPermission.ALL.value)
20        pdf_outputoptions_setencryption(options, encryption)
21
22        # Allow removal of signatures. Otherwise the Encryption property is ignored for signed input documents
23        # (see warning category SignWarningCategory.SIGNED_DOC_ENCRYPTION_UNCHANGED).
24        sign_outputoptions_setremovesignatures(options, SignSignatureRemoval.SIGNED.value)
25
26        # Encrypt the document
27        signer = sign_signer_new()
28        out_document = sign_signer_process(signer, input_document, output_stream_descriptor, options, None)
29        if not out_document:
30            print_error_message("The processing has failed.")
31            exit(1)  
32
33        pdf_document_close(out_document)
34    pdf_document_close(input_document)
35
Download code sample
1Sub Encrypt(password As String, inPath As String, outPath As String)
2    ' Open input document
3    Using inStr = File.OpenRead(inPath)
4        Using inDoc = Document.Open(inStr)
5
6            ' Create stream for output file
7            Using outStr = File.Create(outPath)
8
9                ' Set encryption options
10                Dim outputOptions = New Sign.OutputOptions() With {
11                    .Encryption = New Encryption(password, Nothing, Permission.All),
12                    .RemoveSignatures = Sign.SignatureRemoval.Signed
13                }
14
15                ' Encrypt the document
16                Using outDoc = New Sign.Signer().Process(inDoc, outStr, outputOptions)
17                End Using
18            End Using
19        End Using
20    End Using
21End Sub
Download code sample

Optimizing documents

Optimize a PDF

1// Open input document
2pInStream = _tfopen(szInPath, _T("rb"));
3GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInStream, _T("Failed to open the input file \"%s\" for reading.\n"), szInPath);
4TPdfToolsSys_StreamDescriptor inDesc;
5PdfToolsSysCreateFILEStreamDescriptor(&inDesc, pInStream, 0);
6pInDoc = PdfToolsPdf_Document_Open(&inDesc, _T(""));
7GOTO_CLEANUP_IF_NULL_PRINT_ERROR(
8    pInDoc, _T("Failed to create a document from the input file \"%s\". %s (ErrorCode: 0x%08x).\n"), szInPath,
9    szErrorBuff, PdfTools_GetLastError());
10
11// Create output stream for writing
12pOutStream = _tfopen(szOutPath, _T("wb+"));
13GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutStream, _T("Failed to open the output file \"%s\" for writing.\n"), szOutPath);
14TPdfToolsSys_StreamDescriptor outDesc;
15PdfToolsSysCreateFILEStreamDescriptor(&outDesc, pOutStream, 0);
16
17// Create the profile that defines the optimization parameters.
18// The Web profile is suitable to optimize documents for electronic document exchange.
19pProfile = (TPdfToolsOptimizationProfiles_Profile*)PdfToolsOptimizationProfiles_Web_New();
20
21// Optionally the profile's parameters can be changed according to the
22// requirements of your optimization process.
23
24// Optimize the document
25pOptimizer = PdfToolsOptimization_Optimizer_New();
26pOutDoc    = PdfToolsOptimization_Optimizer_OptimizeDocument(pOptimizer, pInDoc, &outDesc, pProfile, NULL);
27GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutDoc, _T("The processing has failed. (ErrorCode: 0x%08x).\n"),
28                                 PdfTools_GetLastError());
29
Download code sample
1private static void Optimize(string inPath, string outPath)
2{
3    // Open input document
4    using var inStr = File.OpenRead(inPath);
5    using var inDoc = Document.Open(inStr);
6
7    // Create the profile that defines the optimization parameters.
8    // The Web profile is used to optimize documents for electronic document exchange.
9    var profile = new Profiles.Web();
10
11    // Optionally the profile's parameters can be changed according to the 
12    // requirements of your optimization process.
13
14    // Create output stream
15    using var outStr = File.Create(outPath);
16
17    // Optimize the document
18    using var outDoc = new Optimizer().OptimizeDocument(inDoc, outStr, profile);
19}
Download code sample
1private static void optimize(String inPath, String outPath) throws Exception
2{
3    // Create the profile that defines the optimization parameters.
4    // The Web profile is used to optimize documents for electronic document exchange.
5    Web profile = new Web();
6
7    // Optionally the profile's parameters can be changed according to the 
8    // requirements of your optimization process.
9
10    try (
11        // Open input document
12        FileStream inStr = new FileStream(inPath, FileStream.Mode.READ_ONLY);
13        Document inDoc = Document.open(inStr);
14
15        // Create output stream
16        FileStream outStr = new FileStream(outPath, FileStream.Mode.READ_WRITE_NEW);
17
18        // Optimize the document
19        Document outDoc = new Optimizer().optimizeDocument(inDoc, outStr, profile))
20    {
21    }
22}
Download code sample
1# Open input document
2with io.FileIO(input_file_path, 'rb') as input_file:
3    input_stream_descriptor = StreamDescriptor(input_file)
4    input_document = pdf_document_open(input_stream_descriptor, None)
5    if not input_document:
6        print_error_message("Failed to open input document.")
7        exit(1)
8
9    # Create output stream for writing
10    with io.FileIO(output_file_path, 'wb+') as output_file:
11        output_stream_descriptor = StreamDescriptor(output_file)
12
13        # Create the profile that defines the optimization parameters.
14        # The Web profile is suitable to optimize documents for electronic document exchange.
15        profile = optimizationprofiles_web_new()
16
17        # Optionally the profile's parameters can be changed according to the
18        # requirements of your optimization process.
19
20        optimizer = optimization_optimizer_new()
21
22        # Optimize the document
23        out_doc = optimization_optimizer_optimizedocument(optimizer, input_document, output_stream_descriptor, profile, None)
24        if not out_doc:
25            print_error_message("Error while optimizing.")
26            exit(1)
27
28        pdf_document_close(out_doc)
29
30    pdf_document_close(input_document)
31
Download code sample
1Private Sub Optimize(inPath As String, outPath As String)
2    ' Open input document
3    Using inStr = File.OpenRead(inPath)
4        Using inDoc = Document.Open(inStr)
5
6            ' Create the profile that defines the optimization parameters.
7            ' The Web profile is used to optimize documents for electronic document exchange.
8            Dim profile = New Profiles.Web()
9
10            ' Optionally the profile's parameters can be changed according to the 
11            ' requirements of your optimization process.
12
13            ' Create output stream
14            Using outStr = File.Create(outPath)
15
16                ' Optimize the document
17                Using outDoc = New Optimizer().OptimizeDocument(inDoc, outStr, profile)
18                End Using
19            End Using
20        End Using
21    End Using
22End Sub
Download code sample

Powering AI applications

Convert images to an accessible PDF/A document

1
2# Store stream descriptors and images in lists
3stream_list = []
4images = image_documentlist_new()
5
6# Loop over all the image paths and store opened images into list
7for image_path in image_paths:
8    input_file = open(image_path, 'rb')
9    input_stream_descriptor = StreamDescriptor(input_file)
10    stream_list.append(input_stream_descriptor)
11    input_image = image_document_open(input_stream_descriptor)
12    if not input_image:
13        print_error_message(f"Failed to open input image {image_path}.")
14        exit(1)                
15    image_documentlist_add(images, input_image)
16
17# Create output stream for writing
18with io.FileIO(output_file_path, 'wb+') as output_file:
19    output_stream_descriptor = StreamDescriptor(output_file)
20
21    # Create the profile that defines the conversion parameters.
22    # The Archive profile converts images to PDF/A documents for archiving.
23    profile = image2pdfprofiles_archive_new()
24
25    # Set conformance of output document to PDF/A-2a
26    image2pdfprofiles_archive_setconformance(profile, PdfConformance.PDF_A2_A.value)
27
28    # For PDF/A level A, an alternate text is required for each page of the image.
29    # This is optional for other PDF/A levels, e.g. PDF/A-2b.
30    image2pdfprofiles_archive_setlanguage(profile, "en")
31
32    # Set alternate texts created by AI
33    alternate_text_list = image2pdfprofiles_archive_getalternatetext(profile)
34    for image_path in image_paths:                
35        alternate_text = get_alternate_text(image_path)
36        stringlist_add(alternate_text_list, alternate_text)
37
38    converter = image2pdf_converter_new()
39    out_document = image2pdf_converter_convertmultiple(converter, images, output_stream_descriptor, profile, None)
40    if not out_document:
41        print_error_message(f"Error while converting images to Pdf.")
42        exit(1)
43
44    pdf_document_close(out_document)
45
46
1# AI: Create alternate text.
2def get_alternate_text(image_path):
3
4    # Getting base64 representation of input image
5    with open(image_path, "rb") as image_file:
6        base64_image = base64.b64encode(image_file.read()).decode('utf-8')
7
8    # Instantiate OpenAI client and let AI create the alternate text
9    client = OpenAI(api_key="***insert-open-ai-api-key***")
10    response = client.chat.completions.create(
11        model="gpt-4-turbo",
12        messages=[
13            {
14            "role": "user",
15            "content": [
16                {"type": "text", "text": "Write a short sentence what can be seen on the image. It shall explain to a person with impaired vision what is on the image. Write the answer in a poetic way in english."},
17                {
18                    "type": "image_url",
19                    "image_url":
20                        {
21                            "url": f"data:image/jpeg;base64,{base64_image}",
22                        },
23                },
24            ],
25            }
26        ],
27        max_tokens=300,
28    )
29
30    return response.choices[0].message.content.strip()
Download code sample

Sign documents

Sign a PDF and add a visual appearance on an unsigned signature field.

1static void AddAppearanceSignatureField(string certificateFile, string password, string appConfigFile, string inPath, string outPath)
2{
3    // Create a session to the built-in cryptographic provider
4    using var session = new PdfTools.Crypto.Providers.BuiltIn.Provider();
5
6    // Create signature configuration from PFX (or P12) file
7    using var pfxStr = File.OpenRead(certificateFile);
8    var signature = session.CreateSignatureFromCertificate(pfxStr, password);
9
10    // Open input document
11    using var inStr = File.OpenRead(inPath);
12    using var inDoc = Document.Open(inStr);
13
14    // Choose first signature field
15    foreach (var field in inDoc.SignatureFields)
16    {
17        if (field != null)
18        {
19            signature.FieldName = field.FieldName;
20            break;
21        }
22    }
23
24    // Create stream for output file
25    using var outStr = File.Create(outPath);
26
27    // Create appearance from either an XML or a json file
28    using var appStream = File.OpenRead(appConfigFile);
29    if (Path.GetExtension(appConfigFile) == ".xml")
30        signature.Appearance = Appearance.CreateFromXml(appStream);
31    else
32        signature.Appearance = Appearance.CreateFromJson(appStream);
33
34    signature.Appearance.CustomTextVariables.Add("company", "Daily Planet");
35
36    // Sign the input document
37    using var outDoc = new Signer().Sign(inDoc, signature, outStr);
38}
Download code sample
1private static void sign(String certificateFile, String password, String appConfigFile, String inPath, String outPath) throws Exception
2{
3    try (
4        // Create a session to the built-in cryptographic provider
5        Provider session = new Provider();
6
7        // Open certificate file
8        FileStream pfxStr = new FileStream(certificateFile, FileStream.Mode.READ_ONLY);
9
10        // Open input document
11        FileStream inStr = new FileStream(inPath, FileStream.Mode.READ_ONLY);
12        Document inDoc = Document.open(inStr);)
13    {
14        // Create signature configuration from PFX (or P12) file
15        SignatureConfiguration signature = session.createSignatureFromCertificate(pfxStr, password);
16
17        // Choose first signature field
18        for (int i = 0; i < inDoc.getSignatureFields().size(); i++) {
19            if (inDoc.getSignatureFields().get(i) != null) {
20                signature.setFieldName(inDoc.getSignatureFields().get(i).getFieldName());
21                break;
22            }
23        }
24
25        try (
26           // Create appearance from either an XML or a json file
27            FileStream appConfigStr = new FileStream(appConfigFile, FileStream.Mode.READ_ONLY))
28        {
29            if (appConfigFile.toLowerCase().endsWith(".xml"))