11
votes

ITEXT + HTMLWORKER - Comment changer de police par défaut?

Je dois créer un fichier PDF à partir d'une source HTML. Actuellement, je m'adresse à un problème de caractères spéciaux (polonais) dans le fichier de sortie, précisément avec leur manque.

Source HTML: P>

Map<String,Object> providers = new HashMap<String, Object>();

defaultFontProvider dfp = new defaultFontProvider("arial.ttf");

providers.put(HTMLWorker.FONT_PROVIDER, dfp);

HTMLWorker htmlWorker = new HTMLWorker(document);
htmlWorker.setProviders(providers);


3 commentaires

Pouvons-nous faire cela lors de la création d'un document pdf / a-2 à l'aide d'IText à partir d'un fichier HTML et CSS?


@Sumit Regardez cet exemple: développeurs.itextpdf.com/examples / ...


Cet exemple ne crée pas d'un fichier HTML et CSS, je suis bloqué lorsque vous utilisez XMLworker, pouvez-vous consulter ma question Stackoverflow.com / q / 52736441/3169868


6 Réponses :


3
votes

Idée n ° 1

Une réponse à l'esprit: changer itext. Spécifiquement, poly.getcalculébasefont code>, ligne 644. p> xxx pré>

En réalité, je ne pense pas que cela fonctionnera à moins que vous ne changez également que les polices sont créées. ... LIGNE 712 P>

class DefaultFontProvider extends FontFactoryImp {
  private String default;
  public DefaultFontProvider(String def) {
    default = def;
  }

  // I believe this is the correct override, but there are quite a few others.
  public Font getFont(String fontname, String encoding, boolean embedded, float size, int style, BaseColor color, boolean cached) {
    if (fontName == null || fontName.size() == 0) {
      fontName = default;
    }
    return super.getFont(fontName, encoding, embedded, size, style, color, cached);
  }
}


Map<String,Object> providers = new HashMap<String, Object)();
providers.put(HTMLWorker.FONT_PROVIDER, new DefaultFontProvider("Arial Bold"));

myHTMLWorker.setProviders(providers);


7 commentaires

J'essayais de faire fonctionner votre idée # 1, mais sans résultats satisfaisants.


J'ai converti ARIAL TTF en AFM, copiez-la des ressources, puis changez basefont.helvetica pour le faire pointer sur Arial. Enfin, j'ai eu PDF, mais avec une erreur "La police Arial MT contient une Bad / Bebbox." et # $ # $% au lieu de caractères polonais. Le seul positif est un article arial dans le document de production :)


J'ai trouvé ceci: OK. Vous avez une mauvaise police. Les polices sont des structures compliquées et votre police ne dispose pas de toutes les entrées interines requises. "BBOX" Tenez-vous pour une borne de liaison et est une gamme de nombres décrivant la plus petite case qui contiendrait tous les caractères de la police. Une police 1 PostScript Type 1 doit, sur un système PC, être contenue dans un fichier avec une extension "PFB" ou "PFA". Il sera accompagné d'un fichier "PFM", mais ce n'est pas strictement partie de la police.


Donc, vous ne faites rien de mal. Votre code fonctionne et le PDF a fière allure. C'est une police mauvaise / corrompue. Parlez à quiconque fournissait la police ou trouvez un fournisseur de polices différent.


Avez-vous essayé d'enregistrer un fournisseur de polices? Cela ressemble à la bonne façon de le faire.


J'ai essayé de défautFontProvider et il semble prometteur, mais cela ne fonctionne toujours pas comme prévu. La sortie PDF a intégré la police souhaitée, mais il y a aussi Helvetica et le document n'utilise pas fourni la police TTF. Des idées? Je pense que nous sommes proches ... :)


Pouvez-vous ajouter le code de votre fournisseur de polices? Ou est-ce que je l'ai bien compris?



-1
votes

VIDS protégé pdfbutton_click (expéditeur d'objet, evenargs e) { Liste showcourses = nouvelle liste (); CourseManager Acoursanager = Nouveau CourseManager (); int kearkid = convert.toint16 (Départementdropdownlist.text); INT semestrie = convert.toint16 (semestredropdownlist.text); Showcourses = Acoursanager.GetschedulecoursesByDeptimingTandsemester (Département, semestre);

        Document doc = new Document(iTextSharp.text.PageSize.LETTER, 10, 10, 42, 35);
        string pdfFilePath = Server.MapPath("CoursePdf.pdf");
        PdfWriter wri = PdfWriter.GetInstance(doc, new FileStream(pdfFilePath, FileMode.Create));
        doc.Open(); //Open Document to write
        iTextSharp.text.Font font8 = FontFactory.GetFont("ARIAL", 7);
        string heading = " \t\t                                          Course Schedule Details for Department: " +
                                departmentDropDownList.SelectedItem;
        Paragraph reportHeading = new Paragraph(heading);
        if (showCourses != null)
        {
            PdfPTable PdfTable = new PdfPTable(6);
            PdfPCell PdfPCell = null;
            PdfPCell = new PdfPCell(new Phrase(new Chunk("Course Code", font8)));
            PdfTable.AddCell(PdfPCell);
            PdfPCell = new PdfPCell(new Phrase(new Chunk("Course Name", font8)));
            PdfTable.AddCell(PdfPCell);
            PdfPCell = new PdfPCell(new Phrase(new Chunk("Semester Name", font8)));
            PdfTable.AddCell(PdfPCell);
            PdfPCell = new PdfPCell(new Phrase(new Chunk("Course Credit", font8)));
            PdfTable.AddCell(PdfPCell);
            PdfPCell = new PdfPCell(new Phrase(new Chunk("Assign To", font8)));
            PdfTable.AddCell(PdfPCell);
            PdfPCell = new PdfPCell(new Phrase(new Chunk("Schedule", font8)));
            PdfTable.AddCell(PdfPCell);

            foreach (ShowCourse aCourse in showCourses)
            {
                PdfPCell = new PdfPCell(new Phrase(new Chunk(aCourse.courseCode, font8)));
                PdfTable.AddCell(PdfPCell);
                PdfPCell = new PdfPCell(new Phrase(new Chunk(aCourse.courseName, font8)));
                PdfTable.AddCell(PdfPCell);
                PdfPCell = new PdfPCell(new Phrase(new Chunk(aCourse.semesterName, font8)));
                PdfTable.AddCell(PdfPCell);
                PdfPCell = new PdfPCell(new Phrase(new Chunk((aCourse.credit).ToString(), font8)));
                PdfTable.AddCell(PdfPCell);
                PdfPCell = new PdfPCell(new Phrase(new Chunk(aCourse.teacherName , font8)));
                PdfTable.AddCell(PdfPCell);
                PdfPCell = new PdfPCell(new Phrase(new Chunk(aCourse.schedule, font8)));
                PdfTable.AddCell(PdfPCell);
            }
            PdfTable.SpacingBefore = 15f; // Give some space after the text or it m
            doc.Add(reportHeading); // add paragraph to the document
            doc.Add(PdfTable); // add pdf table to the document
            doc.Close();
            // string pdfPath = Server.MapPath("~/SomePDFFile.pdf");
            WebClient client = new WebClient();
            Byte[] buffer = client.DownloadData(pdfFilePath);
            Response.ContentType = "application/pdf";
            Response.AddHeader("content-length", buffer.Length.ToString());
            Response.BinaryWrite(buffer);
        }

    }


0 commentaires

1
votes

Dans votre étiquette de style, vous pouvez peut-être utiliser CSS3 pour changer la police: xxx

Je ne sais pas si c'est ce que vous demandiez.


0 commentaires

0
votes

Si vous souhaitez utiliser différentes polices de PDF, incluez le package de polices.

J'ai eu un problème que certains caractères turcs ne sont pas imprimés dans le document PDF, donc j'ai inclus package de police dans pdf comme Ceci .


0 commentaires

2
votes

Il ne fera pas la police par défaut, mais uniquement cette balise où vous allez postuler.

XMLWorkerHelper.getInstance().parseXHtml(writer, document, new ByteArrayInputStream(html.getBytes(Charset.forName("UTF-8"))), null,Charset.forName("UTF-8"), new XMLWorkerFontProvider("/fonts/"));


0 commentaires

0
votes

Vous pouvez ajouter de la feuille de style à HTML Parser. Cela devrait résoudre le problème de la police et des diacritiques, mais vous devez faire un bon choix lors du choix de la police.

           HttpContext.Current.Response.ContentType = "application / pdf";
            HttpContext.Current.Response.AddHeader("content-disposition", "attachment;filename=" + HttpUtility.UrlPathEncode(name));
            HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.NoCache);
            StringWriter sw = new StringWriter();
            HtmlTextWriter hw = new HtmlTextWriter(sw);
            Page.RenderControl(hw);
           
            StringReader sr = new StringReader(sw.ToString());
            Document pdfDoc = new Document(header.Length > 7 ? header.Length > 14 ? header.Length > 21 ? PageSize.A3.Rotate() : PageSize.A3 : PageSize.A4.Rotate() : PageSize.A4, 10f, 10f, 10f, 0f);
            HTMLWorker htmlparser = new HTMLWorker(pdfDoc);
            string sylfaenpath = Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\sylfaen.ttf";
            FontFactory.Register(sylfaenpath, "sylfaen");

            htmlparser.SetStyleSheet(GenerateStyleSheet());

            PdfWriter.GetInstance(pdfDoc, HttpContext.Current.Response.OutputStream);
            
            pdfDoc.Open();
            htmlparser.Parse(sr);
            pdfDoc.Close();
            HttpContext.Current.Response.Write(pdfDoc);
            HttpContext.Current.ApplicationInstance.CompleteRequest();


    private static StyleSheet GenerateStyleSheet()
    {
        StyleSheet css = new StyleSheet();

        css.LoadTagStyle("body", "face", "sylfaen");
        css.LoadTagStyle("body", "encoding", "Identity-H");
        css.LoadTagStyle("body", "size", "13pt");
        
        css.LoadTagStyle("h1", "size", "30pt");
        css.LoadTagStyle("h1", "style", "line-height:30pt;font-weight:bold;");
        css.LoadTagStyle("h2", "size", "22pt");
        css.LoadTagStyle("h2", "style", "line-height:30pt;font-weight:bold;margin-top:5pt;margin-bottom:12pt;");
        css.LoadTagStyle("h3", "size", "15pt");
        css.LoadTagStyle("h3", "style", "line-height:25pt;font-weight:bold;margin-top:1pt;margin-bottom:15pt;");
        css.LoadTagStyle("h4", "size", "13pt");
        css.LoadTagStyle("h4", "style", "line-height:23pt;margin-top:1pt;margin-bottom:15pt;");
        css.LoadTagStyle("hr", "width", "100%");
        css.LoadTagStyle("a", "style", "text-decoration:underline;");
        return css;
    }


0 commentaires