Maison > développement back-end > Golang > le corps du texte

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

PHPz
Libérer: 2024-02-10 14:42:09
avant
622 Les gens l'ont consulté

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)
Copier après la connexion

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
}
Copier après la connexion

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)
Copier après la connexion

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!")
}
Copier après la connexion

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!

source:stackoverflow.com
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!