L'éditeur php Youzi vous présentera un outil appelé Go ChromeDP Dans le processus d'impression de pages Web au format PDF, il peut ignorer tous les styles CSS externes et internes et utiliser uniquement les styles CSS du fichier HTML. Cet outil peut aider les développeurs à mieux contrôler le style de sortie PDF et à fournir des options de personnalisation plus flexibles. Avec Go ChromeDP, nous pouvons facilement générer des documents PDF de haute qualité qui répondent à nos besoins, offrant ainsi une meilleure expérience utilisateur et des fonctionnalités pour nos projets. Découvrons ensuite l'utilisation et les fonctionnalités de Go ChromeDP !
go chromedp n'utilise aucun CSS, ni styles internes ni externes (uniquement les styles écrits en html, pas d'autres fichiers). La méthode que j'utilise
page.setdocumentcontent(frametree.frame.id, string(buf.bytes())).do(ctx)
Ajoutez le fichier html à chromedp, et
buf, _, err: = page.printtopdf().do(ctx) if err != nil { return err } _, err = outputbuf.write(buf) if err != nil { return err }
Imprimez au format PDF, mais le PDF résultant n'a pas de styles (même en utilisant un serveur de fichiers CSS externe). J'ai essayé de l'ajouter en utilisant page.getresourcetree().do(ctx)
+ css.createstylesheet(resourcetree.frame.id).do(ctx)
+
css.SetStyleSheetText(stylesheet, `.c { color: red; font-size: 30px; background-color: aqua; } `).Do(ctx)
Cela fonctionne, mais il est difficile de l'utiliser à chaque fois que je veux générer un pdf, surtout dans mon cas car j'utilise le html à partir de html/template. Peut-être existe-t-il un moyen simple d'ajouter du CSS externe à un seul fichier HTML ? qu'en penses-tu?
Merci pour votre réponse
Bohdan
Je souhaite utiliser chromedp pour convertir un modèle go avec des CSS, des images et des polices externes en PDF, mais il ignore tout ce qui se trouve en dehors du fichier HTML principal.
Veuillez noter que le chargement des ressources externes prend un certain temps. Vous devriez attendre qu'ils se chargent. Lorsque la page sera prête, l'événement page.loadeventfired
sera déclenché. Nous pouvons donc attendre cet événement et ensuite imprimer la page. Voir la démo ci-dessous :
package main import ( "context" "fmt" "log" "net/http" "net/http/httptest" "os" "sync" "time" "github.com/chromedp/cdproto/page" "github.com/chromedp/chromedp" ) func main() { ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { // Simulate a network latency. time.Sleep(2 * time.Second) w.Header().Set("Content-Type", "text/css") fmt.Fprint(w, `h1 {font-size: 100pt; color: red;}`) })) defer ts.Close() ctx, cancel := chromedp.NewContext(context.Background()) defer cancel() // construct your html html := `<html> <head> <link rel="stylesheet" href="%s/style.css"> </head> <body> <h1> Hello World! </h1> </body> </html> ` var wg sync.WaitGroup wg.Add(1) if err := chromedp.Run(ctx, chromedp.Navigate("about:blank"), // setup the listener to listen for the page.EventLoadEventFired chromedp.ActionFunc(func(ctx context.Context) error { lctx, cancel := context.WithCancel(ctx) chromedp.ListenTarget(lctx, func(ev interface{}) { if _, ok := ev.(*page.EventLoadEventFired); ok { wg.Done() // remove the event listener cancel() } }) return nil }), chromedp.ActionFunc(func(ctx context.Context) error { frameTree, err := page.GetFrameTree().Do(ctx) if err != nil { return err } return page.SetDocumentContent(frameTree.Frame.ID, fmt.Sprintf(html, ts.URL)).Do(ctx) }), // wait for page.EventLoadEventFired chromedp.ActionFunc(func(ctx context.Context) error { wg.Wait() return nil }), chromedp.ActionFunc(func(ctx context.Context) error { buf, _, err := page.PrintToPDF().Do(ctx) if err != nil { return err } return os.WriteFile("sample.pdf", buf, 0644) }), ); err != nil { log.Fatal(err) } log.Println("done!") }
Référence : https://www.php.cn/link/13c86fac19a52dbc843105b709dc71fc一个>.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!