Convertir PDF a formatos PDF/A

Aspose.PDF para C++ te permite convertir un archivo PDF a un archivo PDF compatible con PDF/A. Antes de hacerlo, el archivo debe ser validado. Este tema explica cómo.

Convierte el archivo usando el método Convert de la clase Document. Antes de convertir el PDF a un archivo compatible con PDF/A, valida el PDF utilizando el método Validate. El resultado de la validación se almacena en un archivo XML y luego este resultado también se pasa al método Convert. También puedes especificar la acción para los elementos que no pueden ser convertidos utilizando la enumeración ConvertErrorAction.

Convertir archivo PDF a PDF/A-1b

El siguiente fragmento de código muestra cómo convertir archivos PDF a PDF/A-1b compatible.

void ConverttoPDFA_1b()
{
    std::clog << __func__ << ": Start" << std::endl;
    // Cadena para el nombre de la ruta
    String _dataDir("C:\\Samples\\Conversion\\");

    // Cadena para el nombre del archivo de entrada
    String infilename("sample.pdf");
    // Cadena para el nombre del archivo de registro
    String logfilename("log.xml");
    // Cadena para el nombre del archivo de salida
    String outfilename("PDFToPDFA_out.pdf");

    // Abrir documento
    auto document = new Document(_dataDir + infilename);

    // Convertir a documento compatible con PDF/A
    // Durante el proceso de conversión, también se realiza la validación
    document->Convert(_dataDir + logfilename, PdfFormat::PDF_A_1B, ConvertErrorAction::Delete);

    // Guardar documento de salida
    document->Save(_dataDir + outfilename);
    std::clog << __func__ << ": Finish" << std::endl;
}

Para realizar solo la validación, use la siguiente línea de código:

void ConverttoPDFA_1b_Validation()
{
    std::clog << __func__ << ": Start" << std::endl;
    // Cadena para el nombre de la ruta
    String _dataDir("C:\\Samples\\Conversion\\");

    // Cadena para el nombre del archivo de entrada
    String infilename("sample.pdf");
    // Cadena para el nombre del archivo de registro
    String logfilename("log.xml");

    // Abrir documento
    auto document = new Document(_dataDir + infilename);

    // Convertir a documento compatible con PDF/A
    // Durante el proceso de conversión, también se realiza la validación
    document->Validate(_dataDir + logfilename, PdfFormat::PDF_A_1B);
    std::clog << __func__ << ": Finish" << std::endl;
}

Convertir archivo PDF a PDF/A-3b

Aspose.PDF para C++ también admite la función de convertir un archivo PDF al formato PDF/A-3b.

void ConverttoPDFA_3b()
{
    std::clog << __func__ << ": Start" << std::endl;
    // Cadena para el nombre de la ruta
    String _dataDir("C:\\Samples\\Conversion\\");

    // Cadena para el nombre del archivo de entrada
    String infilename("sample.pdf");
    // Cadena para el nombre del archivo de registro
    String logfilename("log.xml");
    // Cadena para el nombre del archivo de salida
    String outfilename("PDFToPDFA3b_out.pdf");

    // Abrir documento
    auto document = new Document(_dataDir + infilename);

    // Convertir a documento compatible con PDF/A
    // Durante el proceso de conversión, también se realiza la validación
    document->Convert(_dataDir + logfilename, PdfFormat::PDF_A_3B, ConvertErrorAction::Delete);

    // Guardar documento de salida
    document->Save(_dataDir + outfilename);
    std::clog << __func__ << ": Finish" << std::endl;
}

Convertir archivo PDF a PDF/A-2u

Aspose.PDF para C++ también admite la función de convertir un archivo PDF al formato PDF/A-2u.

void ConverttoPDFA_2u()
{
    std::clog << __func__ << ": Start" << std::endl;
    // Cadena para el nombre de la ruta
    String _dataDir("C:\\Samples\\Conversion\\");

    // Cadena para el nombre del archivo de entrada
    String infilename("sample.pdf");
    // Cadena para el nombre del archivo de registro
    String logfilename("log.xml");
    // Cadena para el nombre del archivo de salida
    String outfilename("PDFToPDFA3b_out.pdf");

    // Abrir documento
    auto document = new Document(_dataDir + infilename);

    // Convertir a documento compatible con PDF/A
    // Durante el proceso de conversión, también se realiza la validación
    document->Convert(_dataDir + logfilename, PdfFormat::PDF_A_2U, ConvertErrorAction::Delete);

    // Guardar documento de salida
    document->Save(_dataDir + outfilename);
    std::clog << __func__ << ": Finish" << std::endl;
}

Convertir archivo PDF a PDF/A-3u

Aspose.PDF para C++ también admite la función de convertir un archivo PDF al formato PDF/A-3u.

void ConverttoPDFA_3u()
{
    std::clog << __func__ << ": Start" << std::endl;
    // Cadena para el nombre de la ruta
    String _dataDir("C:\\Samples\\Conversion\\");

    // Cadena para el nombre del archivo de entrada
    String infilename("sample.pdf");
    // Cadena para el nombre del archivo de registro
    String logfilename("log.xml");
    // Cadena para el nombre del archivo de salida
    String outfilename("PDFToPDFA3b_out.pdf");

    // Abrir documento
    auto document = new Document(_dataDir + infilename);

    // Convertir a documento compatible con PDF/A
    // Durante el proceso de conversión, también se realiza la validación
    document->Convert(_dataDir + logfilename, PdfFormat::PDF_A_2U, ConvertErrorAction::Delete);

    // Guardar documento de salida
    document->Save(_dataDir + outfilename);
    std::clog << __func__ << ": Finish" << std::endl;
}

Añadir adjunto al archivo PDF/A

En caso de que tenga un requisito para adjuntar archivos al formato de cumplimiento PDF/A, recomendamos usar el valor PDF_A_3A de la enumeración Aspose.PDF.PdfFormat.

PDF/A_3a es el formato que proporciona la característica de adjuntar cualquier formato de archivo como un adjunto a un archivo compatible con PDF/A.

void ConverttoPDFA_AddAttachment()
{
    std::clog << __func__ << ": Inicio" << std::endl;
    // Cadena para el nombre de la ruta
    String _dataDir("C:\\Samples\\Conversion\\");

    // Cadena para el nombre del archivo de entrada
    String infilename("sample.pdf");
    // Cadena para el nombre del archivo de registro
    String logfilename("log.xml");
    // Cadena para el nombre del archivo de salida
    String outfilename("PDFToPDFA3b_out.pdf");

    // Abrir documento
    auto document = new Document(_dataDir + infilename);

    // Configurar nuevo archivo para agregar como adjunto
    auto fileSpecification = MakeObject<FileSpecification>(_dataDir + String("aspose-logo.jpg"), String("Archivo de imagen grande"));
    // Agregar adjunto a la colección de adjuntos del documento
    document->get_EmbeddedFiles()->Add(fileSpecification);

    // Convertir a documento compatible con PDF/A
    // Durante el proceso de conversión, también se realiza la validación
    document->Convert(_dataDir + logfilename, PdfFormat::PDF_A_3A, ConvertErrorAction::Delete);

    // Guardar documento de salida
    document->Save(_dataDir + outfilename);
    std::clog << __func__ << ": Finalizar" << std::endl;
}

Sustituir fuentes faltantes con fuentes alternativas

Según los estándares de PDFA, las fuentes deben estar incrustadas en el documento PDFA. Sin embargo, si las fuentes no están incrustadas en el documento fuente o no existen en la máquina, entonces PDFA falla en la validación. En este caso, tenemos un requisito para sustituir las fuentes faltantes con algunas fuentes alternativas de la máquina. Podemos sustituir las fuentes faltantes usando el método SimpleFontSubsituation de la siguiente manera durante la conversión de PDF a PDFA.

void ConverttoPDFA_ReplaceFont()
{
    std::clog << __func__ << ": Start" << std::endl;
    // String para el nombre de la ruta
    String _dataDir("C:\\Samples\\Conversion\\");

    // String para el nombre del archivo de entrada
    String infilename("sample.pdf");
    // String para el nombre del archivo de log
    String logfilename("log.xml");
    // String para el nombre del archivo de salida
    String outfilename("PDFToPDFA3b_out.pdf");

    // Abrir documento
    auto document = new Document(_dataDir + infilename);

    System::SharedPtr<Aspose::Pdf::Text::Font> originalFont;
    try
    {
        originalFont = FontRepository::FindFont(String("AgencyFB"));
    }
    catch (Exception)
    {
        // La fuente falta en la máquina de destino
        auto substitutions = FontRepository::get_Substitutions();
        auto substitution = MakeObject<SimpleFontSubstitution>(String("AgencyFB"), String("Helvetica"));
        substitutions->Add(substitution);
    }

    // Convertir a documento compatible con PDF/A
    try {
        // Durante el proceso de conversión, también se realiza la validación
        document->Convert(_dataDir + logfilename, PdfFormat::PDF_A_1B, ConvertErrorAction::Delete);

        // Guardar documento de salida
        document->Save(_dataDir + outfilename);
    }
    catch (Exception ex) {
        std::cerr << ex->get_Message();
    }
    std::clog << __func__ << ": Finish" << std::endl;
}