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
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}
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 }
1
2
3merge(args.input_path, args.output_path)
4
1def merge(input_paths: str, output_path: str):
2 # Create output stream
3 with io.FileIO(output_path, 'wb+') as output_stream:
4 with DocumentAssembler(output_stream, None, None) as assembler:
5
6 for input_path in input_paths:
7 with open(input_path, 'rb') as input_stream:
8 with Document.open(input_stream) as input_document:
9 # Append the content of the input documents to the output document
10 assembler.append(input_document)
11
12 # Merge input documents into an output document
13 assembler.assemble()
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
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
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}
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}
1def split_pdf(input_file_path: str, output_file_path: str):
2 # Open input document
3 with open(input_file_path, 'rb') as input_stream:
4 with Document.open(input_stream) as input_document:
5 # Split the input document page by page
6 for i in range(1, input_document.page_count + 1):
7 current_out_file = construct_file_name(output_file_path, i)
8 with open(current_out_file, 'wb+') as output_stream:
9 with DocumentAssembler(output_stream, None, None) as assembler:
10 assembler.append(input_document, i, i)
11 assembler.assemble()
1# Construct file name from input path and page number of input document
2def construct_file_name(input_file: str, page_number: int):
3 # Split the directory and file name from the input path
4 directory, basename = os.path.split(input_file)
5
6 # Split the file base name and extension
7 base, extension = os.path.splitext(basename)
8
9 return os.path.join(directory, f"{base}_page_{page_number}{extension}")
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
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}
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}
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}
1def convert_if_not_conforming(input_file_path: str, output_file_path: str, conformance: Conformance):
2 with io.FileIO(input_file_path, 'rb') as in_stream:
3 with Document.open(in_stream) as input_document:
4
5 # Create the Validator object, and use the Conformance object to create
6 # an AnalysisOptions object that controls the behavior of the Validator.
7 validator = Validator()
8 analysis_options = AnalysisOptions()
9 analysis_options.conformance = conformance
10
11 # Run the analysis, and check the results.
12 # Only proceed if document is not conforming.
13 analysis_result = validator.analyze(input_document, analysis_options)
14 if analysis_result.is_conforming:
15 print(f"Document conforms to {input_document.conformance.name} already.")
16 return
17
18 # Create a converter object
19 converter = Converter()
20
21 # Add handler for conversion events
22 converter.add_conversion_event_handler(event_handler)
23
24 with io.FileIO(output_file_path, 'wb+') as output_stream:
25
26 # Convert the input document to PDF/A using the converter object
27 # and its conversion event handler
28 output_document = converter.convert(analysis_result, input_document, output_stream, None)
29
30 # Check if critical conversion events occurred
31 match events_severity:
32 case EventSeverity.INFORMATION:
33 print(f"Successfully converted document to {output_document.conformance.name}.")
34
35 case EventSeverity.WARNING:
36 print(f"Warnings occurred during the conversion of document to {output_document.conformance.name}.")
37 print("Check the output file to decide if the result is acceptable.")
38
39 case EventSeverity.ERROR:
40 raise Exception(f"Unable to convert document to {conformance.name} because of critical conversion events.")
1def event_handler(data_part: str, message: str, severity: EventSeverity, category: EventCategory, code: EventCode, context_info: str, page_no: int):
2
3 # Get the event's suggested severity
4 suggested_severity = severity
5
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.
9
10 global events_severity
11
12 if suggested_severity > events_severity:
13 events_severity = suggested_severity
14
15 # Report conversion event
16 if suggested_severity == EventSeverity.INFORMATION:
17 severity_char = 'I'
18 elif suggested_severity == EventSeverity.WARNING:
19 severity_char = 'W'
20 else:
21 severity_char = 'E'
22
23 if page_no > 0:
24 print(f"- {severity_char} {category.name}: {message} ({context_info} on page {page_no})")
25 else:
26 print(f"- {severity_char} {category.name}: {message} ({context_info})")
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
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}
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}
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 }
1def add_zugferd_invoice(input_path: str, zugferd_xml_path: str, output_path: str):
2 # Open input document
3 with io.FileIO(input_path, 'rb') as input_stream:
4 with Document.open(input_stream) as input_document:
5 # Create the Validator object, and use the Conformance object to create
6 # an AnalysisOptions object that controls the behavior of the Validator.
7 validator = Validator()
8 # The conformance has to be set to PDF/A-3 when adding the XML invoice file
9 analysis_options = AnalysisOptions()
10 analysis_options.conformance = Conformance.PDF_A3_U
11
12 # Run the analysis
13 analysis_result = validator.analyze(input_document, analysis_options)
14
15 # Create a converter object
16 converter = Converter()
17
18 # Add the invoice XML file
19 with io.FileIO(zugferd_xml_path, 'rb') as invoice_stream:
20 converter.add_invoice_xml(InvoiceType.ZUGFERD, invoice_stream)
21
22 # Add handler for conversion events
23 event_severity_holder = [EventSeverity.INFORMATION]
24 converter.add_conversion_event_handler(lambda *args: handle_conversion_event(*args, event_severity_holder))
25
26 # Create output file
27 with io.FileIO(output_path, 'wb+') as output_stream:
28 # Convert the input document to PDF/A
29 with converter.convert(analysis_result, input_document, output_stream) as output_document:
30 if event_severity_holder[0] == EventSeverity.INFORMATION:
31 print(f"Successfully converted document to {output_document.conformance.name}.")
32 elif event_severity_holder[0] == EventSeverity.WARNING:
33 print(f"Warnings occurred during the conversion to {output_document.conformance}.")
34 print("Check the output file to decide if the result is acceptable.")
35 elif event_severity_holder[0] == EventSeverity.ERROR:
36 raise Exception(f"Unable to convert document to PDF/A-3U because of critical conversion events.")
1def handle_conversion_event(data_part: str, message: str, severity: EventSeverity, category: EventCategory, code: EventCode, context: str, page_no: int, event_severity_holder: list[EventSeverity]):
2 # Optionally the suggested severity can be changed according to
3 # the requirements of your conversion process and, for example,
4 # the event's category (e.Category).
5
6 if severity > event_severity_holder[0]:
7 event_severity_holder[0] = severity
8
9 print(f"- {severity.name} {category.name}: {message} ({context}{f' on page {page_no}' if page_no > 0 else ''})")
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
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
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}
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}
1
2
3pdf_to_image(args.input_path, args.output_path)
4
1def pdf_to_image(input_pdf_path: str, output_image_path: str):
2 # Open input document
3 with io.FileIO(input_pdf_path, 'rb') as input_pdf_stream:
4 with Document.open(input_pdf_stream) as input_pdf_document:
5 # Create the profile that defines the conversion parameters.
6 # The Archive profile converts PDF documents to TIFF images for archiving.
7 profile = Archive()
8
9 # Optionally the profile's parameters can be changed according to the
10 # requirements of your conversion process.
11
12 # Create output stream
13 with io.FileIO(output_image_path, 'wb+') as output_stream:
14 # Convert the PDF document to an image document
15 converter = Converter()
16 converter.convert_document(input_pdf_document, output_stream, profile)
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
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}
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}
1
2
3image_to_pdf(args.input_path, args.alternate_text, args.output_path)
4
1def image_to_pdf(input_path: str, alternate_text: str, output_path: str):
2 # Open image document
3 with io.FileIO(input_path, 'rb') as image_stream:
4 with Document.open(image_stream) as image_document:
5 # Create the profile that defines the conversion parameters.
6 # The Archive profile converts images to PDF/A documents for archiving.
7 profile = Archive()
8
9 # Set conformance of output document to PDF/A-2a
10 profile.conformance = Conformance.PDF_A2_A
11
12 # For PDF/A level A, an alternate text is required for each page of the image.
13 # This is optional for other PDF/A levels, e.g. PDF/A-2b.
14 profile.language = "en"
15 profile.alternate_text.append(alternate_text)
16
17 # Optionally other profile parameters can be changed according to the
18 # requirements of your conversion process.
19
20 # Create output stream
21 with io.FileIO(output_path, 'wb+') as output_stream:
22 # Convert the image to a tagged PDF/A document
23 converter = Converter()
24 converter.convert(image_document, output_stream, profile)
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
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
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}
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}
1
2
3convert_image_to_pdf(args.input_path, args.output_path)
4
1def convert_image_to_pdf(input_path: str, output_path: str):
2 # Open image document
3 with io.FileIO(input_path, 'rb') as in_stream:
4 with Document.open(in_stream) as input_document:
5
6 # Create the profile that defines the conversion parameters (Default profile)
7 profile = Default()
8
9 # Optionally, you can adjust the profile's parameters if needed
10
11 # Create output stream
12 with io.FileIO(output_path, 'wb+') as output_stream:
13
14 # Convert the image to a PDF document
15 converter = Converter()
16 converter.convert(input_document, output_stream, profile)
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
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
21 // Create output stream
22 using var outStream = File.Create(outPath);
23 using var outPdf = new Converter().ConvertMultiple(images, outStream, profile);
24 }
25 finally
26 {
27 foreach (var image in images)
28 image.Dispose();
29 foreach (var stream in streams)
30 stream.Dispose();
31 }
32}
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}
1
2
3images_to_pdf(args.input_path, args.output_path)
4
1def images_to_pdf(input_image_paths: list[str], output_file_path: str):
2 try:
3 stream_list = []
4 images = ImageDocumentList()
5
6 # Open input images and store in list
7 for input_image_path in input_image_paths:
8 image_stream = io.FileIO(input_image_path, 'rb')
9 stream_list.append(image_stream)
10 images.append(ImageDocument.open(image_stream))
11
12 # Create the profile that defines the conversion parameters.
13 profile = Default()
14
15 # Optionally the profile's parameters can be changed according to the
16 # requirements of your conversion process.
17
18 # Create output stream
19 with io.FileIO(output_file_path, 'wb+') as output_stream:
20 converter = Converter()
21 converter.convert_multiple(images, output_stream, profile)
22 finally:
23 if 'images' in locals():
24 for image in images:
25 image.__exit__(None, None, None)
26 if 'stream_list' in locals():
27 for stream in stream_list:
28 stream.__exit__(None, None, None)
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
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
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}
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}
1
2
3# Decrypt a PDF document
4decrypt(args.password, args.input_path, args.output_path)
5
1def decrypt(password: str, input_path: str, output_path: str):
2 # Use password to open encrypted input document
3 with io.FileIO(input_path, 'rb') as in_stream:
4 with Document.open(in_stream, password) as input_document:
5 if input_document.permissions == None:
6 print(f"Input file is not encrypted.")
7 return
8
9 # Create stream for output file
10 with io.FileIO(output_path, 'wb+') as output_stream:
11 # Set encryption options
12 output_options = SignOutputOptions()
13 # Set encryption parameters to no encryption
14 output_options.encryption = None
15 # Allow removal of signatures. Otherwise the Encryption property is ignored for signed input documents
16 # (see warning category Sign.WarningCategory.SignedDocEncryptionUnchanged).
17 output_options.remove_signatures = SignatureRemoval.SIGNED
18
19 # Decrypt the document
20 signer = Signer()
21 signer.process(input_document, output_stream, output_options)
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
Encrypt 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// 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
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}
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}
1
2
3# Encrypt a PDF document
4encrypt(args.password, args.input_path, args.output_path)
5
1def encrypt(password: str, input_path: str, output_path: str):
2 # Open input document
3 with io.FileIO(input_path, 'rb') as in_stream:
4 with Document.open(in_stream) as input_document:
5 # Create stream for output file
6 with io.FileIO(output_path, 'wb+') as output_stream:
7 # Set encryption options
8 output_options = SignOutputOptions()
9 # Set a user password that will be required to open the document.
10 # Note that this will remove PDF/A conformance of input files (see warning category Sign.WarningCategory.PdfARemoved)
11 output_options.encryption = Encryption(password, None, Permission.ALL)
12 # Allow removal of signatures. Otherwise the Encryption property is ignored for signed input documents
13 # (see warning category Sign.WarningCategory.SignedDocEncryptionUnchanged).
14 output_options.remove_signatures = SignatureRemoval.SIGNED
15
16 # Encrypt the document
17 signer = Signer()
18 signer.process(input_document, output_stream, output_options)
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
Getting started
Hello, Pdftools SDK!
1// 1. Open input image document using memory stream
2pCoverImageStream = _tfopen(szCoverImagePath, _T("rb"));
3GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pCoverImageStream, _T("Failed to open the input file \"%s\" for reading.\n"),
4 szCoverImagePath);
5PdfToolsSysCreateFILEStreamDescriptor(&inImageDesc, pCoverImageStream, 0);
6pCoverImageDoc = PdfToolsImage_Document_Open(&inImageDesc);
7GOTO_CLEANUP_IF_NULL_PRINT_ERROR(
8 pCoverImageDoc, _T("Failed to create a document from the input file \"%s\". %s (ErrorCode: 0x%08x).\n"),
9 szCoverImagePath, szErrorBuff, PdfTools_GetLastError());
10
11// 2. Create output stream in memory for the cover page (image as PDF)
12PdfToolsSys_MemoryStreamDescriptor_Create(&outImageDesc);
13pProfile = (TPdfToolsImage2PdfProfiles_Profile*)PdfToolsImage2PdfProfiles_Default_New();
14pConverter = PdfToolsImage2Pdf_Converter_New();
15pOutCoverPdfDoc = (TPdfToolsPdf_Document*)PdfToolsImage2Pdf_Converter_Convert(pConverter, pCoverImageDoc,
16 &outImageDesc, pProfile, NULL);
17GOTO_CLEANUP_IF_NULL_PRINT_ERROR(
18 pOutCoverPdfDoc, "The processing 'Image to PDF' has failed. (ErrorCode: 0x%08x).\n", PdfTools_GetLastError());
19
20// 3. Open input content document in-memory
21pInputPdfStream = _tfopen(szInContentPath, _T("rb"));
22GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInputPdfStream, _T("Failed to open the input file \"%s\" for reading.\n"),
23 szInContentPath);
24PdfToolsSysCreateFILEStreamDescriptor(&inContentDesc, pInputPdfStream, 0);
25pInContentDoc = PdfToolsPdf_Document_Open(&inContentDesc, _T(""));
26GOTO_CLEANUP_IF_NULL_PRINT_ERROR(
27 pInContentDoc, _T("Failed to create a document from the input file \"%s\". %s (ErrorCode: 0x%08x).\n"),
28 szInContentPath, szErrorBuff, PdfTools_GetLastError());
29
30// 4. Create final output document in-memory
31pOutFinalStream = _tfopen(szOutFinalPath, _T("wb+"));
32GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutFinalStream, _T("Failed to create output file \"%s\" for writing.\n"),
33 szOutFinalPath);
34PdfToolsSysCreateFILEStreamDescriptor(&outFinalDesc, pOutFinalStream, 0);
35pAssembler = PdfToolsDocumentAssembly_DocumentAssembler_New(&outFinalDesc, NULL, NULL);
36
37// Define first and last page (only one page for the cover)
38int firstPage = 1;
39int lastPage = 1;
40// 5. Append the first page of the image document to the final output
41GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PdfToolsDocumentAssembly_DocumentAssembler_Append(
42 pAssembler, pOutCoverPdfDoc, &firstPage, &lastPage, NULL, NULL),
43 "Failed to append the image document. (ErrorCode: 0x%08x).\n",
44 PdfTools_GetLastError());
45
46// 6. Append content document to the final output
47GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(
48 PdfToolsDocumentAssembly_DocumentAssembler_Append(pAssembler, pInContentDoc, NULL, NULL, NULL, NULL),
49 "Failed to append the content document. (ErrorCode: 0x%08x).\n", PdfTools_GetLastError());
50
51// 7. Merge input documents into an output document
52pOutFinalDoc = PdfToolsDocumentAssembly_DocumentAssembler_Assemble(pAssembler);
53GOTO_CLEANUP_IF_NULL_PRINT_ERROR(
54 pOutFinalDoc,
55 "The processing of merging the first page with the PDF content has failed. (ErrorCode: 0x%08x).\n",
56 PdfTools_GetLastError());
57
1private static void Image2Pdf(string inPath, MemoryStream imageStream)
2{
3 // Open image document
4 using var inStr = File.OpenRead(inPath);
5 using var inDoc = PdfTools.Image.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 // Convert the image to a PDF document
15 var outDoc = new Converter().Convert(inDoc, imageStream, profile);
16}
1private static void Merge(MemoryStream coverStream, FileStream inputContentStream, 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 docAssembler.Append(PdfTools.Pdf.Document.Open(coverStream), 1, 1);
8 docAssembler.Append(PdfTools.Pdf.Document.Open(inputContentStream));
9
10 // Merge input documents into an output document
11 docAssembler.Assemble();
12}
1private static void image2Pdf(String inPath, MemoryStream imageStream) throws Exception {
2 // Create the profile that defines the conversion parameters.
3 Default profile = new Default();
4
5 try (
6 // Open input document
7 FileStream inStr = new FileStream(inPath, FileStream.Mode.READ_ONLY);
8 com.pdftools.image.Document inDoc = com.pdftools.image.Document.open(inStr)
9 ) {
10 // Convert the image to a PDF document
11 new Converter().convert(inDoc, imageStream, profile);
12 } catch (Exception e) {
13 System.out.println("Error during image to PDF conversion: " + e.getMessage());
14 e.printStackTrace();
15 throw e;
16 }
17}
1private static void merge(MemoryStream coverStream, FileStream inputContentStream, String outPath) throws Exception {
2 try (
3 FileStream outStream = new FileStream(outPath, FileStream.Mode.READ_WRITE_NEW);
4 DocumentAssembler docAssembler = new DocumentAssembler(outStream)) {
5
6 // Append only the first page of the cover stream
7 docAssembler.append(com.pdftools.pdf.Document.open(coverStream), 1, 1);
8 // Append the content document
9 docAssembler.append(com.pdftools.pdf.Document.open(inputContentStream));
10
11 // Assemble the merged document
12 docAssembler.assemble();
13 }
14}
1# Convert the image cover to a PDF (stored in memory)
2with io.BytesIO() as cover_stream:
3 with io.FileIO(cover_image, 'rb') as image_stream:
4 with ImageDocument.open(image_stream) as image_document:
5
6 # Create the profile for converting the image to PDF
7 profile = Default()
8
9 # Convert image to PDF
10 converter = Converter()
11 converter.convert(image_document, cover_stream, profile)
12
13 # Prepare the content PDF and merge with the cover
14 with io.FileIO(content_pdf_path, 'rb') as content_pdf_stream:
15 with PdfDocument.open(content_pdf_stream) as content_pdf_document:
16
17 # Open output stream and append cover and content
18 with io.FileIO(output_path, 'wb+') as output_stream:
19 with DocumentAssembler(output_stream, None, None) as assembler:
20 # Append cover page (convert from memory stream to PDF)
21 assembler.append(PdfDocument.open(io.BytesIO(cover_stream.getvalue())), 1, 1)
22
23 # Append the content PDF
24 assembler.append(content_pdf_document)
25
26 # Finalize the merged document
27 assembler.assemble()
28
Optimizing documents
Flatten Annotations
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 MinimalFileSize profile is used to to produce a minimal file size
19pProfile = (TPdfToolsOptimizationProfiles_Profile*)PdfToolsOptimizationProfiles_MinimalFileSize_New();
20
21// Optionally the profile's parameters can be changed according to the
22// requirements of your optimization process.
23// Set the profile to flatten annotations (include as well Forms and Links)
24TPdfToolsOptimization_RemovalOptions* pRemovalOptions =
25 PdfToolsOptimizationProfiles_Profile_GetRemovalOptions(pProfile);
26PdfToolsOptimization_RemovalOptions_SetAnnotations(pRemovalOptions,
27 ePdfToolsOptimization_ConversionStrategy_Flatten);
28PdfToolsOptimization_RemovalOptions_SetFormFields(pRemovalOptions,
29 ePdfToolsOptimization_ConversionStrategy_Flatten);
30PdfToolsOptimization_RemovalOptions_SetLinks(pRemovalOptions, ePdfToolsOptimization_ConversionStrategy_Flatten);
31
32// Optimize the document
33pOptimizer = PdfToolsOptimization_Optimizer_New();
34pOutDoc = PdfToolsOptimization_Optimizer_OptimizeDocument(pOptimizer, pInDoc, &outDesc, pProfile, NULL);
35GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutDoc, _T("The processing has failed. (ErrorCode: 0x%08x).\n"),
36 PdfTools_GetLastError());
37
1private static void FlattenAnnotations(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 MinimalFileSize profile is used to to produce a minimal file size
9 var profile = new Profiles.MinimalFileSize();
10
11 // Optionally the profile's parameters can be changed according to the
12 // requirements of your optimization process.
13 profile.RemovalOptions.Annotations = ConversionStrategy.Flatten;
14 profile.RemovalOptions.FormFields = ConversionStrategy.Flatten;
15 profile.RemovalOptions.Links = ConversionStrategy.Flatten;
16
17 // Create output stream
18 using var outStr = File.Create(outPath);
19
20 // Optimize the document
21 using var outDoc = new Optimizer().OptimizeDocument(inDoc, outStr, profile);
22}
1private static void flattenAnnotations(String inPath, String outPath) throws Exception
2{
3 // Create the profile that defines the optimization parameters.
4 // The MinimalFileSize profile is used to to produce a minimal file size
5 MinimalFileSize profile = new MinimalFileSize();
6
7 // Optionally the profile's parameters can be changed according to the
8 // requirements of your optimization process.
9 profile.getRemovalOptions().setAnnotations(ConversionStrategy.FLATTEN);
10 profile.getRemovalOpt