Examples

Integration Examples

API Usage Examples

Utilities

Test logging

error_type process_logging() {

    // Disable logging for unit testing
    RETURN_ERROR_IF_NOT_SUCCESS(Logging_SetSeverity(LoggingSeverity_Off));

    return VANILLAPDF_TEST_ERROR_SUCCESS;
}

Validate file structure

RETURN_ERROR_IF_NOT_SUCCESS(FileStructureValidator_Validate(file, &result));
RETURN_ERROR_IF_NOT_SUCCESS(FileStructureValidationResult_IsValid(result, &is_valid));
RETURN_ERROR_IF_NOT_SUCCESS(FileStructureValidationResult_GetIssueCount(result, &issue_count));
RETURN_ERROR_IF_NOT_SUCCESS(FileStructureValidationResult_GetErrorCount(result, &error_count));
RETURN_ERROR_IF_NOT_SUCCESS(FileStructureValidationResult_GetWarningCount(result, &warning_count));

printf("Issues: %llu (%llu error(s), %llu warning(s))\n",
    (unsigned long long)issue_count,
    (unsigned long long)error_count,
    (unsigned long long)warning_count);

for (size_type i = 0; i < issue_count; i++) {
    FileStructureIssueHandle* issue = NULL;
    FileStructureIssueSeverityType severity = FileStructureIssueSeverity_Undefined;
    FileStructureIssueCodeType code = FileStructureIssueCode_Undefined;
    BufferHandle* message = NULL;
    string_type data = NULL;
    size_type size = 0;

    RETURN_ERROR_IF_NOT_SUCCESS(FileStructureValidationResult_GetIssueAt(result, i, &issue));
    RETURN_ERROR_IF_NOT_SUCCESS(FileStructureIssue_GetSeverity(issue, &severity));
    RETURN_ERROR_IF_NOT_SUCCESS(FileStructureIssue_GetCode(issue, &code));
    RETURN_ERROR_IF_NOT_SUCCESS(FileStructureIssue_GetMessage(issue, &message));
    RETURN_ERROR_IF_NOT_SUCCESS(Buffer_GetData(message, &data, &size));

    printf("[severity=%d code=%d]: %.*s\n", (int)severity, (int)code, (int)size, data);

    if (message) Buffer_Release(message);
    if (issue) FileStructureIssue_Release(issue);
}

Enumerate xref

error_type process_file(FileHandle* file, int nested) {
    XrefChainHandle* chain = NULL;
    XrefChainIteratorHandle* chain_iterator = NULL;
    boolean_type valid = VANILLAPDF_RV_FALSE;

    RETURN_ERROR_IF_NOT_SUCCESS(File_XrefChain(file, &chain));
    RETURN_ERROR_IF_NOT_SUCCESS(XrefChain_GetIterator(chain, &chain_iterator));

    while (VANILLAPDF_ERROR_SUCCESS == XrefChainIterator_IsValid(chain_iterator, &valid)
        && VANILLAPDF_RV_TRUE == valid) {
        XrefHandle* xref = NULL;

        RETURN_ERROR_IF_NOT_SUCCESS(XrefChainIterator_GetValue(chain_iterator, &xref));
        RETURN_ERROR_IF_NOT_SUCCESS(process_xref(xref, nested));
        RETURN_ERROR_IF_NOT_SUCCESS(Xref_Release(xref));
        RETURN_ERROR_IF_NOT_SUCCESS(XrefChainIterator_Next(chain_iterator));
    }

    RETURN_ERROR_IF_NOT_SUCCESS(XrefChainIterator_Release(chain_iterator));
    RETURN_ERROR_IF_NOT_SUCCESS(XrefChain_Release(chain));

    return VANILLAPDF_TEST_ERROR_SUCCESS;
}

Additional Resources

  • main.c — Main file for command-line application vanillapdf.tools

  • tools.h — Tools project header file including macro definitions