将PDF转换为PDF/A格式

Aspose.PDF for C++ 允许您将PDF文件转换为符合PDF/A标准的PDF文件。在此之前,必须对文件进行验证。本文解释了如何进行。

使用Document类的Convert方法转换文件。 在将PDF转换为符合PDF/A的文件之前,使用Validate方法验证PDF。验证结果存储在XML文件中,然后此结果也传递给Convert方法。您还可以使用ConvertErrorAction枚举指定无法转换的元素的操作。

将PDF文件转换为PDF/A-1b

以下代码片段展示了如何将PDF文件转换为符合PDF/A-1b的PDF。

void ConverttoPDFA_1b()
{
    std::clog << __func__ << ": Start" << std::endl;
    // 路径名称的字符串
    String _dataDir("C:\\Samples\\Conversion\\");

    // 输入文件名的字符串
    String infilename("sample.pdf");
    // 日志文件名的字符串
    String logfilename("log.xml");
    // 输出文件名的字符串
    String outfilename("PDFToPDFA_out.pdf");

    // 打开文档
    auto document = new Document(_dataDir + infilename);

    // 转换为符合PDF/A的文档
    // 在转换过程中,也会进行验证
    document->Convert(_dataDir + logfilename, PdfFormat::PDF_A_1B, ConvertErrorAction::Delete);

    // 保存输出文档
    document->Save(_dataDir + outfilename);
    std::clog << __func__ << ": Finish" << std::endl;
}

要仅执行验证,请使用以下代码行:

void ConverttoPDFA_1b_Validation()
{
    std::clog << __func__ << ": Start" << std::endl;
    // 路径名称的字符串
    String _dataDir("C:\\Samples\\Conversion\\");

    // 输入文件名称的字符串
    String infilename("sample.pdf");
    // 日志文件名称的字符串
    String logfilename("log.xml");

    // 打开文档
    auto document = new Document(_dataDir + infilename);

    // 转换为符合 PDF/A 的文档
    // 在转换过程中,也会执行验证
    document->Validate(_dataDir + logfilename, PdfFormat::PDF_A_1B);
    std::clog << __func__ << ": Finish" << std::endl;
}

将 PDF 文件转换为 PDF/A-3b

Aspose.PDF for C++ 也支持将 PDF 文件转换为 PDF/A-3b 格式的功能。

void ConverttoPDFA_3b()
{
    std::clog << __func__ << ": Start" << std::endl;
    // 路径名称的字符串
    String _dataDir("C:\\Samples\\Conversion\\");

    // 输入文件名称的字符串
    String infilename("sample.pdf");
    // 日志文件名称的字符串
    String logfilename("log.xml");
    // 输入文件名称的字符串
    String outfilename("PDFToPDFA3b_out.pdf");

    // 打开文档
    auto document = new Document(_dataDir + infilename);

    // 转换为符合 PDF/A 的文档
    // 在转换过程中,也会执行验证
    document->Convert(_dataDir + logfilename, PdfFormat::PDF_A_3B, ConvertErrorAction::Delete);

    // 保存输出文档
    document->Save(_dataDir + outfilename);
    std::clog << __func__ << ": Finish" << std::endl;
}

将PDF文件转换为PDF/A-2u

Aspose.PDF for C++ 还支持将PDF文件转换为PDF/A-2u格式的功能。

void ConverttoPDFA_2u()
{
    std::clog << __func__ << ": Start" << std::endl;
    // 路径名称的字符串
    String _dataDir("C:\\Samples\\Conversion\\");

    // 输入文件名的字符串
    String infilename("sample.pdf");
    // 日志文件名的字符串
    String logfilename("log.xml");
    // 输出文件名的字符串
    String outfilename("PDFToPDFA3b_out.pdf");

    // 打开文档
    auto document = new Document(_dataDir + infilename);

    // 转换为符合PDF/A的文档
    // 在转换过程中,还会进行验证
    document->Convert(_dataDir + logfilename, PdfFormat::PDF_A_2U, ConvertErrorAction::Delete);

    // 保存输出文档
    document->Save(_dataDir + outfilename);
    std::clog << __func__ << ": Finish" << std::endl;
}

将PDF文件转换为PDF/A-3u

Aspose.PDF for C++ 还支持将PDF文件转换为PDF/A-3u格式的功能。

void ConverttoPDFA_3u()
{
    std::clog << __func__ << ": 开始" << std::endl;
    // 路径名的字符串
    String _dataDir("C:\\Samples\\Conversion\\");

    // 输入文件名的字符串
    String infilename("sample.pdf");
    // 日志文件名的字符串
    String logfilename("log.xml");
    // 输出文件名的字符串
    String outfilename("PDFToPDFA3b_out.pdf");

    // 打开文档
    auto document = new Document(_dataDir + infilename);

    // 转换为符合 PDF/A 的文档
    // 在转换过程中,还会进行验证
    document->Convert(_dataDir + logfilename, PdfFormat::PDF_A_2U, ConvertErrorAction::Delete);

    // 保存输出文档
    document->Save(_dataDir + outfilename);
    std::clog << __func__ << ": 完成" << std::endl;
}

将附件添加到 PDF/A 文件

如果您需要将文件附加到符合 PDF/A 的格式,我们建议使用 Aspose.PDF.PdfFormat 枚举中的 PDF_A_3A 值。

PDF/A_3a 是一种格式,提供将任何文件格式作为附件附加到符合 PDF/A 的文件的功能。

void ConverttoPDFA_AddAttachment()
{
    std::clog << __func__ << ": 开始" << std::endl;
    // 路径名称的字符串
    String _dataDir("C:\\Samples\\Conversion\\");

    // 输入文件名的字符串
    String infilename("sample.pdf");
    // 日志文件名的字符串
    String logfilename("log.xml");
    // 输出文件名的字符串
    String outfilename("PDFToPDFA3b_out.pdf");

    // 打开文档
    auto document = new Document(_dataDir + infilename);

    // 设置要添加为附件的新文件
    auto fileSpecification = MakeObject<FileSpecification>(_dataDir + String("aspose-logo.jpg"), String("大型图像文件"));
    // 将附件添加到文档的附件集合
    document->get_EmbeddedFiles()->Add(fileSpecification);

    // 转换为符合PDF/A的文档
    // 在转换过程中,还会进行验证
    document->Convert(_dataDir + logfilename, PdfFormat::PDF_A_3A, ConvertErrorAction::Delete);

    // 保存输出文档
    document->Save(_dataDir + outfilename);
    std::clog << __func__ << ": 完成" << std::endl;
}

使用替代字体替换缺失字体

根据PDFA标准,字体应嵌入在PDFA文档中。但是,如果字体未嵌入源文档中或不存在于机器上,则PDFA验证会失败。在这种情况下,我们需要用机器上的一些替代字体替换缺失的字体。我们可以在PDF到PDFA转换过程中使用SimpleFontSubsituation方法替换缺失的字体,如下所示。

void ConverttoPDFA_ReplaceFont()
{
    std::clog << __func__ << ": Start" << std::endl;
    // 路径名的字符串
    String _dataDir("C:\\Samples\\Conversion\\");

    // 输入文件名的字符串
    String infilename("sample.pdf");
    // 日志文件名的字符串
    String logfilename("log.xml");
    // 输出文件名的字符串
    String outfilename("PDFToPDFA3b_out.pdf");

    // 打开文档
    auto document = new Document(_dataDir + infilename);

    System::SharedPtr<Aspose::Pdf::Text::Font> originalFont;
    try
    {
        originalFont = FontRepository::FindFont(String("AgencyFB"));
    }
    catch (Exception)
    {
        // 目标机器上缺少字体
        auto substitutions = FontRepository::get_Substitutions();
        auto substitution = MakeObject<SimpleFontSubstitution>(String("AgencyFB"), String("Helvetica"));
        substitutions->Add(substitution);
    }

    // 转换为PDF/A兼容文档
    try {
        // 在转换过程中,也会进行验证
        document->Convert(_dataDir + logfilename, PdfFormat::PDF_A_1B, ConvertErrorAction::Delete);

        // 保存输出文档
        document->Save(_dataDir + outfilename);
    }
    catch (Exception ex) {
        std::cerr << ex->get_Message();
    }
    std::clog << __func__ << ": Finish" << std::endl;
}