2
votes

MVC Net Core 3.1: outil pour créer et télécharger un fichier PDF

Au cours des 2 derniers jours, j'ai essayé plusieurs outils pour créer un fichier PDF. Auparavant, j'ai utilisé iTextSharp mais dans l'application Console dans .Net 4. Maintenant, je veux créer un PDF dans Asp Net Core, quand j'ai essayé d'utiliser iTextSharp, j'ai trouvé qu'il y avait d'autres packages de pépites que je peux utiliser. Je les ai installés et fait le codage mais j'ai beaucoup d'erreurs de référence. J'ai également essayé plusieurs autres outils, mais j'ai des problèmes au moment de l'exécution ou au moment de la conception, à un moment donné, mon programme tombait en panne et au moment de l'exécution et j'ai dû annuler mes modifications.

Quelqu'un peut-il me guider vers un didacticiel adapté à Asp .Net Core 3.1? Il peut s'agir d'un exemple de création d'un PDF à partir du html ou de la liste d'objets.


0 commentaires

3 Réponses :


1
votes

Jetez un œil à Rotativa (peut personnellement dire que cela fonctionne très bien) -

https://www.nuget.org/packages/Rotativa.AspNetCore/1.2.0-beta

La page GitHub a un tutoriel sur la façon de commencer -

https://github.com/webgio/Rotativa


0 commentaires

1
votes

Recommander Rotativa aussi, pense qu'il est très pratique à utiliser. J'ai fait une démo, dont vous pouvez avoir une référence.

1.Téléchargez le Rotativa.AspNetCore partir de nuget.

2. nous devons ajouter un nouveau dossier dans wwwroot avec le nom «Rotativa» et dans ce dossier, puis ajouter les wkhtmltoimage.exe files wkhtmltopdf.exe , wkhtmltoimage.exe files .

entrez la description de l'image ici

Vous pouvez obtenir les deux fichiers à partir de l'exemple de démonstration GitHub

https://github.com/webgio/Rotativa.AspNetCore/tree/master/Rotativa.AspNetCore.Demo/wwwroot/Rotativa

3.Configurez-le dans votre Startup.cs

@model IEnumerable<User>

@{
    ViewData["Title"] = "Index";
}

<h1>@ViewData["Data"]</h1>
<h1>@ViewBag.Data2</h1>

<h1>@ViewData["Title"]</h1>

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Id)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Address)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Id)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Name)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Address)
                </td>
                <td>
                    <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                    <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                    <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

4.Dans l'action de votre contrôleur, changez simplement le returnType en ViewAsPdf , puis il affichera la vue au format pdf.

public IActionResult DemoViewAsPDF()
{
    var users = new List<User>()
    {
        new User{ Id = 1, Name = "AA", Address = "Address1"},
        new User{ Id = 2, Name = "BB", Address = "Address2"},
        new User{ Id = 3, Name = "CC", Address = "Address3"},
        new User{ Id = 4, Name = "DD", Address = "Address4"},
    };
    ViewData["Data"] = "ViewDataValue";
    ViewBag.Data2 = "ViewBagValue";
    return new ViewAsPdf(users, ViewData);
}

La vue Index:

return new ViewAsPdf(users) 
{ 
    FileName="MyPdf.pdf"
};

Résultat:

entrez la description de l'image ici

Si vous souhaitez le télécharger, vous pouvez simplement lui donner un nom de fichier

@model IEnumerable<User>

@{
    ViewData["Title"] = "Index";
}

<h1>Index</h1>

<table class="table">
    <thead>
        <tr>
            <th>
                @Html.DisplayNameFor(model => model.Id)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Name)
            </th>
            <th>
                @Html.DisplayNameFor(model => model.Address)
            </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
        @foreach (var item in Model)
        {
            <tr>
                <td>
                    @Html.DisplayFor(modelItem => item.Id)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Name)
                </td>
                <td>
                    @Html.DisplayFor(modelItem => item.Address)
                </td>
                <td>
                    <a asp-action="Edit" asp-route-id="@item.Id">Edit</a> |
                    <a asp-action="Details" asp-route-id="@item.Id">Details</a> |
                    <a asp-action="Delete" asp-route-id="@item.Id">Delete</a>
                </td>
            </tr>
        }
    </tbody>
</table>

Mise à jour:

Action:

public IActionResult Index()
{
    var users = new List<User>()
    {
        new User{ Id = 1, Name = "AA", Address = "Address1"},
        new User{ Id = 2, Name = "BB", Address = "Address2"},
        new User{ Id = 3, Name = "CC", Address = "Address3"},
        new User{ Id = 4, Name = "DD", Address = "Address4"},
    };
    return new ViewAsPdf(users);
}

Vue:

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllerRoute(
        name: "default",
        pattern: "{controller=Home}/{action=Index}/{id?}");
});

var hostingEnvironment = app.ApplicationServices.GetService<Microsoft.AspNetCore.Hosting.IHostingEnvironment>();
RotativaConfiguration.Setup(hostingEnvironment);

Résultat:

entrez la description de l'image ici


4 commentaires

Salut mj1313, j'ai utilisé Rotativa mais la version actuelle ne fonctionnait pas sur asp.net 3.1. Après la recherche, j'ai dû utiliser la version bêta, puis j'ai réussi à créer le fichier pdf. Néanmoins, je me suis retrouvé dans un problème après le début du fait que je ne suis pas en mesure d'accéder à viewbag dans la vue. Voir le message ici stackoverflow.com/questions/59995626/...


Bonjour @Faisal, si vous souhaitez activer ViewBag ou ViewData dans le pdf, vous devez également renvoyer ViewData. Voir ma mise à jour.


Merci génial. mj1313, cela a été utile, je suis en mesure d'obtenir le View.Bag. Tout comme je l'ai mentionné et mentionné par bsod, pour que je puisse faire les choses correctement, je devais obtenir la version bêta de 1.2.0.


Salut mj1313, merci d'avoir montré comment passer ViewBag. Savez-vous comment je peux changer l'orientation de la page en Portrait? Étant donné que le nombre de colonnes est élevé et ne correspond pas bien à la page en vue verticale.



1
votes

Pour .net core, je suis passé à la génération de fichiers PDF à partir de HTML à l'aide de PuppeteerSharp:

https://www.puppeteersharp.com/

Je pense qu'iTextSharp nécessite une licence ces jours-ci, sauf si une version plus ancienne est utilisée.

J'ai également utilisé PdfSharp (une autre bibliothèque gratuite, mais je ne crois pas encore qu'elle supporte .net core. Peut-être une à rechercher dans le futur. Cela fonctionne plutôt bien et beaucoup plus facile à utiliser que iTextSharp.


1 commentaires

Salut Mark, je n'ai pas essayé PuppeteerSharp car j'utilise asp.net 3.1. J'ai vérifié les fichiers dont ils ont été mis à jour pour la dernière fois en 2017 alors que la version asp.net 3.1 fin 2019. Comme j'avais déjà essayé quelques autres outils 3ème pour générer des PDF et que je trouvais des problèmes, je suis allé utiliser Rotativa, mais je vais essayer cela quand je suis libre. Merci