Je travaille sur un projet de serveur Blazor. L'une des exigences est d'afficher les enregistrements dans une fenêtre contextuelle, puis de les imprimer sous forme de document PDF. Si les enregistrements sont trop nombreux pour tenir sur une seule page , le PDF ne sera enregistré que sur une seule page . Ce que je veux dire, c'est qu'il n'y a que quelques enregistrements qui tiennent sur la première page du PDF. Comment faire en sorte que le PDF affiche tous les enregistrements ? Est-ce à cause du CSS ?
Voici le modal :
@page "/dialogcard/{Order}" @using IMS.CoreBusiness @using IMS.UseCases.Interfaces.OrderDetail @using System.Globalization @inject IViewOrderDetailsByOrderIdUseCase ViewOrderDetailsByOrderIdUseCase @inject DialogService DialogService @inject IJSRuntime JsRuntime <style> .rz-dialog-wrapper { left:0; } /*.rz-card{ margin-top: -1.9rem !important; }*/ .rz-dialog-content { margin-top: -55px; } </style> @if (orderDetails != null) { <div id="printarea1"> <div class="row my-4"> <div class="col-md-12"> <RadzenCard> <h3 class="h5"> Order Date: @Order.OrderDateTime </h3> <RadzenTabs> <Tabs> @{ var detailVendorId = 0; } @foreach (var detail in orderDetails) { @if (detailVendorId != detail.VendorId) { <RadzenTabsItem Text="@detail.Vendor.Name"> <div class="row"> <div class="col-lg-6 d-flex"> <RadzenCard Style="width: 100%; overflow: hidden;"> <h3 class="h5">Contact</h3> <div class="d-flex flex-row"> <div> <div>Company</div> <b>Vorlance</b> <div class="mt-3">Responsible</div> <b>@detail.Order.DoneBy</b> <div class="mt-3">Vendor</div> <b>@detail?.Vendor.Name</b> </div> </div> </RadzenCard> </div> <div class="col-lg-6 d-flex"> <RadzenCard Style="width: 100%; overflow: hidden;"> <h3 class="h5">Delivery Information</h3> <div class="row"> <div class="col"> <div>Company Name</div> @switch (detail.Warehouse) { case "Shenzhen Warehouse": <b>@string.Format(new CultureInfo("en-US"), "test")</b> <div>Address</div> <b>@string.Format(new CultureInfo("en-US"), "test")</b> <div>Contact Name</div> <b>@string.Format(new CultureInfo("en-US"), "test")</b> <div>Email</div> <b>@string.Format(new CultureInfo("en-US"), "test")</b> <div>Phone</div> <b>@string.Format(new CultureInfo("en-US"), "+1233455")</b> break; case "USA Warehouse": <b>@string.Format(new CultureInfo("en-US"), "Company Name: TRADING LLC")</b> <div>Address</div> <b>@string.Format(new CultureInfo("en-US"), "1243445,Coconut Creek, FL, ZIP Code: 33073")</b> <div>Contact Name</div> <b>@string.Format(new CultureInfo("en-US"), "Test")</b> <div>Email</div> <b>@string.Format(new CultureInfo("en-US"), "[email protected]")</b> <div>Phone</div> <b>@string.Format(new CultureInfo("en-US"), "+123242422")</b> break; case "Private Shipping": <b>@string.Format(new CultureInfo("en-US"), "ELEKTRONIK SANAYI VE TICARET LTD. STI.")</b> <div>Address</div> <b>@string.Format(new CultureInfo("en-US"), "test")</b> <div>Contact Name</div> <b>@string.Format(new CultureInfo("en-US"), "Test")</b> <div>Email</div> <b>@string.Format(new CultureInfo("en-US"), "[email protected]")</b> <div>Phone</div> <b>@string.Format(new CultureInfo("en-US"), "111122")</b> break; } @* <div>Address</div> <b>@(detail?.Warehouse)</b> *@ </div> </div> </RadzenCard> </div> </div> <RadzenDataGrid AllowFiltering="false" AllowPaging="false" AllowSorting="true" FilterCaseSensitivity="FilterCaseSensitivity.CaseInsensitive" Data="@orderDetails.Where(x => x.VendorId == detail.VendorId)" TItem="OrderDetail" Class="mt-3" Style="height:190px"> <Columns> <RadzenDataGridColumn TItem="OrderDetail" Property="OrderId" Title="Order ID" Width="100px"/> <RadzenDataGridColumn TItem="OrderDetail" Property="Id" Title="Product ID" Width="100px"/> <RadzenDataGridColumn TItem="OrderDetail" Property="ProductCode" Title="Product Code" Width="150px"/> <RadzenDataGridColumn TItem="OrderDetail" Property="Currency" Title="Currency" Width="95px"/> <RadzenDataGridColumn TItem="OrderDetail" Property="Quantity" Title="Quantity" Width="95px"> <FooterTemplate> <b>@string.Format(new CultureInfo("tr-TR"), "{0:G}", orderDetails?.Where(x => x.VendorId == detail.VendorId).Sum(o => o.Quantity))</b> </FooterTemplate> </RadzenDataGridColumn> <RadzenDataGridColumn TItem="OrderDetail" Property="BuyUnitPrice" Title="Unit Price" Width="100px"> <Template Context="detail"> @switch (detail.Currency) { case "USD": @string.Format(new CultureInfo("en-US"), "{0}{1:0.#####}",new CultureInfo("en-US").NumberFormat.CurrencySymbol, detail.BuyUnitPrice) break; case "EURO": @string.Format(new CultureInfo("en-FR"), "{0}{1:0.#####}",new CultureInfo("en-FR").NumberFormat.CurrencySymbol, detail.BuyUnitPrice) break; default: @string.Format(new CultureInfo("tr-TR"), "{0}{1:0.#####}",new CultureInfo("tr-TR").NumberFormat.CurrencySymbol, detail.BuyUnitPrice) break; } </Template> </RadzenDataGridColumn> <RadzenDataGridColumn TItem="OrderDetail" Property="TotalBuyPrice" Title="Total Price" Width="100px"> <Template Context="detail"> @switch (detail.Currency) { case "USD": @string.Format(new CultureInfo("en-US"), "{0}{1:0.#####}",new CultureInfo("en-US").NumberFormat.CurrencySymbol, detail.TotalBuyPrice) break; case "EURO": @string.Format(new CultureInfo("en-FR"), "{0}{1:0.#####}",new CultureInfo("en-FR").NumberFormat.CurrencySymbol, detail.TotalBuyPrice) break; default: @string.Format(new CultureInfo("tr-TR"), "{0}{1:0.#####}",new CultureInfo("tr-TR").NumberFormat.CurrencySymbol, detail.TotalBuyPrice) break; } </Template> <FooterTemplate> @switch (detail.Currency) { case "USD": <b>@string.Format(new CultureInfo("en-US"), "{0:N2}", orderDetails?.Where(x => x.VendorId == detail.VendorId).Sum(o => o.TotalBuyPrice))</b> break; case "EURO": <b>@string.Format(new CultureInfo("en-FR"), "{0:N2}", orderDetails?.Where(x => x.VendorId == detail.VendorId).Sum(o => o.TotalBuyPrice))</b> break; default: <b>@string.Format(new CultureInfo("tr-TR"), "{0:N2}", orderDetails?.Where(x => x.VendorId == detail.VendorId).Sum(o => o.TotalBuyPrice))</b> break; } </FooterTemplate> </RadzenDataGridColumn> </Columns> </RadzenDataGrid> </RadzenTabsItem> } detailVendorId = detail.VendorId; } </Tabs> </RadzenTabs> </RadzenCard> </div> </div> </div> } <div class="row"> <div class="col-md-12 text-right"> <RadzenButton Click="@((args) => DialogService.Close(false))" ButtonStyle="ButtonStyle.Secondary" Text="Close" Style="width: 120px" Class="mr-1"/> <RadzenButton Click="PrintDocument" Text="Print" Style="width: 120px" /> @*<button type="button" class="btn btn-primary btns" @onclick="PrintDocument">Print</button>*@ </div> </div> @code { [Parameter] public ReportViewModel Order { get; set; } IEnumerable<OrderDetail> orderDetails; protected override async Task OnInitializedAsync() { orderDetails = await ViewOrderDetailsByOrderIdUseCase.ExecuteAsync(Order.OrderId); } private void PrintDocument() { JsRuntime.InvokeVoidAsync("print"); } }
Voici une capture d'écran du modèle :
Voici l'aperçu avant impression :
Voici le CSS pertinent :
@media print { body * { visibility: hidden; } #printarea1, #printarea1 *{ visibility: visible; } #printarea, #printarea * { visibility: visible; } .rz-tabview-nav li:not(.rz-tabview-selected) { display: none; } #printarea1 { position: fixed; left: 0; top: 170px; } #printarea { position: fixed; left: 15px; top: 0; } button[type=button], input[type=text] { display: none; } .rz-data-grid { height: unset!important; } }
Modifier 1
J'ai fait quelques recherches et modifié le CSS comme ceci, mais ça fait toujours une page :(
.rz-data-grid { height: auto !important; overflow: visible !important; page-break-after: always; }
Le navigateur utilise par défaut le format A4 comme option de format de page pour imprimer les pages. Afin de s'adapter à la taille de la page, l'aperçu avant impression du navigateur masquera automatiquement le contenu débordant. Par conséquent, une grille de données comportant un grand nombre de colonnes sera découpée pour s'adapter à la taille de la page imprimée.
Pour imprimer un grand nombre de colonnes, ajustez les options de mise à l'échelle dans le panneau des options d'impression en fonction de la taille du contenu.
Lorsque la grille de données contient une grande quantité de données, imprimer toutes les données en même temps n'est pas la meilleure option compte tenu des performances du navigateur. Parce que le rendu de tous les éléments DOM sur une seule page crée des problèmes de performances dans le navigateur. Cela peut rendre le navigateur lent ou ne plus répondre. DataGrid a la possibilité de gérer de grandes quantités de données via la virtualisation. Cependant, lors de l'impression, vous ne pouvez pas utiliser la virtualisation pour les lignes et les colonnes.
Si vous avez encore besoin d'imprimer toutes vos données, nous vous recommandons d'exporter votre grille de données vers Excel ou un fichier CSV ou Pdf et de l'imprimer à partir d'une autre application non Web.
Il existe de nombreuses méthodes et bibliothèques pour générer des PDF, telles que syncfusionetc.