parse net crear convertir convert con asp html asp.net-mvc pdf fonts itextsharp

net - Conversión de iTextSharp HTML a PDF: no se puede cambiar la fuente



itextsharp html to pdf stack overflow (1)

Un par de cosas para que esto funcione

En primer lugar, XMLWorkerHelper no utiliza FontFactory de manera predeterminada, necesita usar una de las sobrecargas para ParseXHtml() que toma un IFontProvider . Ambas sobrecargas requieren que especifique un Stream para un archivo CSS, pero puede pasar el null si su CSS vive dentro de su archivo HTML. Afortunadamente FontFactory tiene una propiedad estática que implementa esto que puedes usar llamado FontFactory.FontImp

// **This guy** XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, msHTML, null, Encoding.UTF8, FontFactory.FontImp);

En segundo lugar, sé que dijiste que intentaste registrar todo tu directorio de fuentes por desesperación, pero puede ser una llamada bastante cara. Si puede, siempre intente simplemente registrar las fuentes que necesita. Aunque es opcional, también recomiendo encarecidamente que defina explícitamente el alias de la fuente porque las fuentes pueden tener varios nombres y no siempre son lo que pensamos.

FontFactory.Register(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "comic.ttf"), "Comic Sans MS");

En tercer lugar, y esto puede no afectarlo, pero las etiquetas que no estén presentes en el HTML, incluso si están lógicamente implícitas, no recibirán el estilo aplicado desde CSS. Eso suena raro, por decirlo de otra manera, si su HTML es simplemente <p>Hello</p> y su CSS es body{font-size: 7px;} , el tamaño de la fuente no se aplicará porque su HTML no tiene el etiqueta <body>

En cuarto lugar, y esto es opcional, pero por lo general es más fácil especificar el HTML y el CSS por separado, lo que haré en el siguiente ejemplo.

Tu código era del 95%, así que con solo un par de ajustes debería funcionar. En lugar de una vista, solo estoy analizando HTML y CSS sin procesar, pero puede modificarlos según sea necesario. Recuerde (y creo que ya lo sabe) que iTextSharp no puede procesar ASP.Net , solo HTML, por lo que debe asegurarse de que su proceso de conversión de ASP.Net a HTML esté en buen estado.

//Sample HTML and CSS var html = @"<body><p>Sva ljudska bića rađaju se slobodna i jednaka u dostojanstvu i pravima. Ona su obdarena razumom i sviješću i trebaju jedna prema drugima postupati u duhu bratstva.</p></body>"; var css = "body{font-size: 7px; font-family: Comic Sans MS;}"; //Register a single font FontFactory.Register(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "comic.ttf"), "Comic Sans MS"); //Placeholder variable for later Byte[] bytes; using (var ms = new MemoryStream()) { using (var doc = new Document()) { doc.SetPageSize(PageSize.A4.Rotate()); using (var writer = PdfWriter.GetInstance(doc, ms)) { doc.Open(); //Get a stream of our HTML using (var msHTML = new MemoryStream(Encoding.UTF8.GetBytes(html))) { //Get a stream of our CSS using (var msCSS = new MemoryStream(Encoding.UTF8.GetBytes(css))) { XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, msHTML, msCSS, Encoding.UTF8, FontFactory.FontImp); } } doc.Close(); } } bytes = ms.ToArray(); }

Estoy creando algunos documentos PDF con iTextSharp (5.5.7.0) desde HTML en la aplicación ASP.NET MVC5, pero no puedo cambiar la fuente. Intenté casi todo lo que pude encontrar en SO o de otros recursos.

El código para la generación de PDF es el siguiente:

public Byte[] GetRecordsPdf(RecordsViewModel model) { var viewPath = "~/Template/RecordTemplate.cshtml"; var renderedReport = RenderViewToString(viewPath, model); FontFactory.RegisterDirectory(Environment.GetFolderPath(Environment.SpecialFolder.Fonts)); using (var ms = new MemoryStream()) { using (var doc = new Document()) { doc.SetPageSize(PageSize.A4.Rotate()); using (var writer = PdfWriter.GetInstance(doc, ms)) { doc.Open(); using (var html = new MemoryStream(Encoding.Default.GetBytes(renderedReport))) { XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, html, Encoding.Default); } doc.Close(); } } var bytes = ms.ToArray(); return bytes; } }

El HTML real está contenido en la variable de cadena renderedReport (he escrito fuertemente el archivo .cshtml que renderizo usando el motor MVC Razor y luego devuelvo HTML en una cadena).

Intenté registrar algunas fuentes específicas, pero eso no ayudó. También traté de registrar todas las fuentes en mi máquina (como se muestra en el ejemplo anterior), pero eso tampoco ayudó. Las fuentes se cargaron. Lo he comprobado en modo de depuración.

CSS está incrustado en el archivo HTML (en el encabezado, etiqueta de estilo) de esta manera:

body { font-size: 7px; font-family: Comic Sans MS; }

(para la prueba, he decidido usar Comic Sans, porque puedo reconocerlo fácilmente, estoy más interesado en Arial Unicode MS en realidad).

Y en realidad puedo cambiar la fuente con ese atributo de la familia de fuentes de CSS, pero solo desde las fuentes preinstaladas por iTextSharp de manera predeterminada: Times New Roman, Arial, Courier y alguna otra (creo que Helvetica). Cuando lo cambio a Comic Sans, o algún otro que no esté precargado, iTextSharp se renderiza con la fuente predeterminada (diría Arial).

La razón por la que necesito cambiar la fuente es porque tengo algunos caracteres croatas en mi HTML procesado (ČĆŠĐŽčćšđž) que faltan en PDF, y actualmente creo que la razón principal es - fuente.

¿Qué me estoy perdiendo?