Maison  >  Article  >  développement back-end  >  Go ChromeDP ignore tout CSS externe ou interne lors de l'impression au format PDF, utilise uniquement le CSS du fichier HTML

Go ChromeDP ignore tout CSS externe ou interne lors de l'impression au format PDF, utilise uniquement le CSS du fichier HTML

PHPz
PHPzavant
2024-02-10 14:42:09623parcourir

Go ChromeDP 在打印到 pdf 期间忽略任何外部或内部 CSS,仅使用 html 文件中的 CSS

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 !

Contenu de la question

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.

Solution de contournement

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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer