Convertir un fichier PDF au format HTML

Aspose.PDF for C++ fournit de nombreuses fonctionnalités pour convertir divers formats de fichiers en documents PDF et convertir des fichiers PDF en divers formats de sortie. Cet article explique comment convertir un fichier PDF en HTML. Aspose.PDF for C++ offre la possibilité de convertir des fichiers HTML en format PDF en utilisant l’approche InLineHtml. Nous avons reçu de nombreuses demandes pour une fonctionnalité qui convertit un fichier PDF en format HTML et avons fourni cette fonctionnalité. Veuillez noter que cette fonctionnalité prend également en charge XHTML 1.0.

Aspose.PDF for C++ prend en charge les fonctionnalités pour convertir un fichier PDF en HTML. Les principales tâches que vous pouvez accomplir avec la bibliothèque Aspose.PDF sont listées :

  • convertir PDF en HTML ;
  • diviser la sortie en HTML multi-pages ;
  • spécifier le dossier pour stocker les fichiers SVG ;
  • compresser les images SVG pendant la conversion ;
  • spécifier le dossier des images ;
  • créer des fichiers subséquents avec uniquement le contenu du corps ;
  • rendu de texte transparent ;
  • rendu des couches du document PDF.

Aspose.PDF pour C++ fournit un code en deux lignes pour transformer un fichier PDF source en HTML. L’énumération SaveFormat contient la valeur Html qui vous permet d’enregistrer le fichier source en HTML. Le snippet de code suivant montre le processus de conversion d’un fichier PDF en HTML.

void ConvertPDFtoHTML()
{
    std::clog << __func__ << ": Start" << std::endl;
    // String for path name
    String _dataDir("C:\\Samples\\Conversion\\");

    // String for file name
    String infilename("sample.pdf");
    String outfilename("PDFToHTML.html");

    // Open document
    auto document = MakeObject<Document>(_dataDir + infilename);

    try {
    // Save the output in HTML format
    document->Save(outfilename, SaveFormat::Html);
    }
    catch (Exception ex) {
    std::cerr << ex->get_Message() << std::endl;
    }
    std::clog << __func__ << ": Finish" << std::endl;
}

Fractionnement de la sortie en HTML multi-pages

Lors de la conversion d’un fichier PDF volumineux avec plusieurs pages au format HTML, la sortie apparaît sous forme d’une seule page HTML. Cela peut finir par être très long. Pour contrôler la taille de la page, il est possible de diviser la sortie en plusieurs pages lors de la conversion de PDF en HTML. Veuillez essayer d’utiliser le code suivant.

void ConvertPDFtoHTML_SplittingOutputToMultiPageHTML()
{
    std::clog << __func__ << ": Début" << std::endl;
    // Chaîne pour le nom du chemin
    String _dataDir("C:\\Samples\\Conversion\\");

    // Chaîne pour le nom du fichier
    String infilename("sample.pdf");
    String outfilename("PDFToHTML.html");

    // Ouvrir le document
    auto document = MakeObject<Document>(_dataDir + infilename);

    // Instancier l'objet d'option de sauvegarde HTML
    auto htmlOptions = MakeObject<HtmlSaveOptions>();
    // Spécifier de diviser la sortie en plusieurs pages
    htmlOptions->set_SplitIntoPages(true);

    try {
    // Enregistrer la sortie au format HTML
    document->Save(_dataDir + outfilename, htmlOptions);
    }
    catch (Exception ex) {
    std::cerr << ex->get_Message() << std::endl;
    }
    std::clog << __func__ << ": Fin" << std::endl;
}

Spécifier le Dossier pour Stocker les Fichiers SVG

Lors de la conversion de PDF en HTML, il est possible de spécifier le dossier dans lequel les images SVG doivent être enregistrées. Utilisez la classe HtmlSaveOption propriété SpecialFolderForSvgImages pour spécifier un répertoire d’images SVG spécial. Cette propriété obtient ou définit le chemin vers le répertoire dans lequel les images SVG doivent être enregistrées lorsqu’elles sont rencontrées lors de la conversion. Si le paramètre est vide ou nul, alors tous les fichiers SVG sont enregistrés avec les autres fichiers image.

void ConvertPDFtoHTML_SpecifyFolderForStoringSVGfiles()
{
    std::clog << __func__ << ": Start" << std::endl;
    // Chaîne pour le nom du chemin
    String _dataDir("C:\\Samples\\Conversion\\");

    // Chaîne pour le nom du fichier
    String infilename("sample.pdf");
    String outfilename("SaveSVGFiles_out.html");

    // Ouvrir le document
    auto document = MakeObject<Document>(_dataDir + infilename);

    // Instancier l'objet d'option de sauvegarde HTML
    auto htmlOptions = MakeObject<HtmlSaveOptions>();

    // Spécifier le dossier où les images SVG sont enregistrées lors de la conversion PDF en HTML
    htmlOptions->SpecialFolderForSvgImages = (_dataDir + String("\\svg\\"));

    // Enregistrer la sortie au format HTML
    document->Save(_dataDir + outfilename, htmlOptions);
    std::clog << __func__ << ": Finish" << std::endl;
}

Compression des images SVG lors de la conversion

Pour compresser les images SVG lors de la conversion PDF en HTML, veuillez essayer d’utiliser le code suivant :

void ConvertPDFtoHTML_CompressingSVGimages()
{
    std::clog << __func__ << ": Start" << std::endl;
    // Chaîne pour le nom du chemin
    String _dataDir("C:\\Samples\\Conversion\\");

    // Chaîne pour le nom du fichier
    String infilename("sample.pdf");
    String outfilename("PDFToHTML.html");

    // Ouvrir le document
    auto document = MakeObject<Document>(_dataDir + infilename);

    // Instancier l'objet d'option de sauvegarde HTML
    auto htmlOptions = MakeObject<HtmlSaveOptions>();

    // Spécifiez le dossier où les images SVG sont enregistrées lors de la conversion PDF en HTML
    htmlOptions->SpecialFolderForSvgImages = (_dataDir + String("\\svg\\"));

    // Enregistrez la sortie au format HTML
    document->Save(_dataDir + outfilename, htmlOptions);
    std::clog << __func__ << ": Finish" << std::endl;
}

Spécification du dossier d’images

Nous pouvons également spécifier le dossier où les images seront enregistrées lors de la conversion PDF en HTML :

void ConvertPDFtoHTML_SpecifyFolderForStoringAllImages()
{
    std::clog << __func__ << ": Démarrer" << std::endl;
    // Chaîne pour le nom du chemin
    String _dataDir("C:\\Samples\\Conversion\\");

    // Chaîne pour le nom du fichier
    String infilename("sample.pdf");
    String outfilename("PDFToHTML.html");

    // Ouvrir le document
    auto document = MakeObject<Document>(_dataDir + infilename);

    // Instancier l'objet d'option de sauvegarde HTML
    auto htmlOptions = MakeObject<HtmlSaveOptions>();

    // Spécifier le dossier où toutes les images sont enregistrées lors de la conversion de PDF en HTML
    htmlOptions->SpecialFolderForAllImages = (_dataDir + String("\\images\\"));

    // Enregistrer la sortie au format HTML
    document->Save(_dataDir + outfilename, htmlOptions);
    std::clog << __func__ << ": Terminer" << std::endl;
}

Créer des fichiers suivants avec uniquement le contenu du corps

Récemment, on nous a demandé d’introduire une fonctionnalité où les fichiers PDF sont convertis en HTML et l’utilisateur peut obtenir uniquement le contenu de la balise <body> pour chaque page. Cela produirait un fichier avec les détails CSS, <html>, <head> et toutes les pages dans d’autres fichiers juste avec les contenus <body>.

Pour répondre à cette exigence, une nouvelle propriété, HtmlMarkupGenerationMode, a été introduite dans la classe HtmlSaveOptions.

Avec l’exemple de code simple suivant, vous pouvez diviser le HTML de sortie en pages. Dans les pages de sortie, tous les objets HTML doivent aller exactement là où ils vont maintenant (traitement et sortie des polices, création et sortie de CSS, création et sortie d’images), sauf que le HTML de sortie contiendra les contenus actuellement placés à l’intérieur des balises (maintenant, les balises “body” seront omises). Cependant, en utilisant cette approche, le lien vers le CSS est la responsabilité de votre code, car des éléments comme seront supprimés. À cette fin, vous pouvez lire le CSS via File.ReadAllText() et l’envoyer via AJAX à une page web où il sera appliqué par jQuery.

void ConvertPDFtoHTML_CreateSubsequentFilesWithBodyContentsOnly()
{
    std::clog << __func__ << ": Start" << std::endl;
    // Chaîne pour le chemin
    String _dataDir("C:\\Samples\\Conversion\\");

    // Chaîne pour le nom de fichier
    String infilename("sample.pdf");
    String outfilename("CreateSubsequentFiles_out.html");

    // Ouvrir le document
    auto document = MakeObject<Document>(_dataDir + infilename);

    // Instancier l'objet d'option de sauvegarde HTML
    auto htmlOptions = MakeObject<HtmlSaveOptions>();

    htmlOptions->HtmlMarkupGenerationMode = HtmlSaveOptions::HtmlMarkupGenerationModes::WriteOnlyBodyContent;
    htmlOptions->set_SplitIntoPages(true);

    // Enregistrer la sortie au format HTML
    document->Save(_dataDir + outfilename, htmlOptions);
    std::clog << __func__ << ": Finish" << std::endl;
}

Rendu de texte transparent

Dans le cas où le fichier PDF source/entrée contient des textes transparents ombragés par des images de premier plan, il pourrait y avoir des problèmes de rendu de texte. Donc, afin de répondre à ces scénarios, les propriétés SaveShadowedTextsAsTransparentTexts et SaveTransparentTexts peuvent être utilisées.

void ConvertPDFtoHTML_TransparentTextRendering()
{
    std::clog << __func__ << ": Start" << std::endl;
    // Chaîne pour le nom du chemin
    String _dataDir("C:\\Samples\\Conversion\\");

    // Chaîne pour le nom du fichier
    String infilename("sample.pdf");
    String outfilename("TransparentTextRendering_out.html");

    // Ouvrir le document
    auto document = MakeObject<Document>(_dataDir + infilename);

    // Instancier l'objet d'option de sauvegarde HTML
    auto htmlOptions = MakeObject<HtmlSaveOptions>();

    htmlOptions->HtmlMarkupGenerationMode = HtmlSaveOptions::HtmlMarkupGenerationModes::WriteOnlyBodyContent;
    htmlOptions->SaveShadowedTextsAsTransparentTexts = true;
    htmlOptions->SaveTransparentTexts = true;

    // Enregistrer la sortie au format HTML
    document->Save(_dataDir + outfilename, htmlOptions);
    std::clog << __func__ << ": Finish" << std::endl;
}

Rendu des couches de document PDF

Nous pouvons rendre les couches de document PDF dans un élément de type couche séparée lors de la conversion de PDF en HTML :

void ConvertPDFtoHTML_DocumentLayersRendering()
{
    std::clog << __func__ << ": Début" << std::endl;
    // Chaîne pour le chemin
    String _dataDir("C:\\Samples\\Conversion\\");

    // Chaîne pour le nom de fichier
    String infilename("sample.pdf");
    String outfilename("LayersRendering_out.html");

    // Ouvrir le document
    auto document = MakeObject<Document>(_dataDir + infilename);

    // Instancier un objet d'option de sauvegarde HTML
    auto htmlOptions = MakeObject<HtmlSaveOptions>();

    // Spécifier de rendre les couches du document PDF séparément dans le HTML de sortie
    htmlOptions->set_ConvertMarkedContentToLayers(true);

    // Enregistrer la sortie au format HTML
    document->Save(_dataDir + outfilename, htmlOptions);
    std::clog << __func__ << ": Fin" << std::endl;
}