J'ai une petite application de bureau C# qui crée un fichier pdf donné au format HTML, récupéré à partir d'un fichier * .eml. Voici un exemple:Conversion de HTML en pdf génère une exception
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
</head>
<body>
<div style="font: normal 13px Arial; color:#000000;">
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><font size="3"><font face="Calibri">Some text<o:p></o:p></font></font><br />
</p>
<p class="MsoNormal" style="MARGIN: 0cm 0cm 0pt"><o:p><font size="3" face="Calibri"> </font></o:p><br />
<span style="FONT-SIZE: 11pt; FONT-FAMILY: "Calibri","sans-serif"; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: "Times New Roman"; mso-fareast-language: EN-US; mso-ascii-theme-font: minor-latin; mso-hansi-theme-font: minor-latin; mso-bidi-theme-font: minor-bidi; mso-ansi-language: IT; mso-bidi-language: AR-SA">Some other text</span>
</p>
</div>
</body>
</html>
Tout fonctionne bien sur ma machine (Win10 x64), mais quand je lance le même code sur la machine du client (Windows Server 2008 R2 64 bits), je reçois le « document a message "aucune page" d'une exception iTextsharp.
Cela arrive parfois, pour des chaînes HTML spécifiques comme celle que je viens de publier; Je ne peux pas exécuter une session de débogage sur la machine du client, cependant j'ai vérifié que le programme reçoit du HTML bien formé (comme il est analysé avec le HTML Agility Pack).
Peut-il s'agir d'un problème de police? Je n'ai absolument aucune idée, ceux-ci semblent être présents sur la machine du client.
Voici un extrait du code que j'utilise pour créer le document pdf (il utilise un processeur de balise image personnalisée, mais il ne devrait pas être la question car il n'y a pas dans l'extrait donné):
using (var document = new Document())
{
var writer = PdfWriter.GetInstance(document, new FileStream(destinationPath, FileMode.Create));
writer.CompressionLevel = PdfStream.BEST_COMPRESSION;
document.Open();
var tagProcessors = (DefaultTagProcessorFactory)Tags.GetHtmlTagProcessorFactory();
tagProcessors.RemoveProcessor(HTML.Tag.IMG);
tagProcessors.AddProcessor(HTML.Tag.IMG, new CustomImageTagProcessor());
CssFilesImpl cssFiles = new CssFilesImpl();
cssFiles.Add(XMLWorkerHelper.GetInstance().GetDefaultCSS());
var cssResolver = new StyleAttrCSSResolver(cssFiles);
cssResolver.AddCss(@"code { padding: 2px 4px; }", "utf-8", true);
var charset = Encoding.UTF8;
var hpc = new HtmlPipelineContext(new CssAppliersImpl(new XMLWorkerFontProvider()));
hpc.SetAcceptUnknown(true).AutoBookmark(true).SetTagFactory(tagProcessors);
var htmlPipeline = new HtmlPipeline(hpc, new PdfWriterPipeline(document, writer));
var pipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
var worker = new XMLWorker(pipeline, true);
var xmlParser = new XMLParser(true, worker, charset);
xmlParser.Parse(new StringReader(fixedMarkup));
}
Merci pour la suggestion, je vais essayer d'obtenir une licence d'essai pour vérifier si c'est une meilleure solution. Je voudrais toujours déterminer les causes du comportement différent sur les deux machines. – mentre83
Je pense (mais cela est plus basé sur l'expérience que sur l'exécution réelle de votre code), il devra probablement faire quelque chose avec des polices, ou d'autres ressources qui ne sont pas disponibles sur un ordinateur, mais sont disponibles sur l'autre. Par exemple, si un glyphe ne peut pas être rendu (parce que la police n'a pas ce glyphe), iText ne rendra tout simplement pas ce caractère. Si tous vos caractères sont ignorés, aucun contenu n'est ajouté et vous obtenez l'exception "document n'a pas de pages". Et Arial Unicode n'est pas disponible sur toutes les machines. –
Mes pensées exactement. Bien que les glyphes ne semblent pas être le problème, je soupçonne que cela a quelque chose à voir avec les polices. Du point de vue des ressources, les machines que j'ai utilisées pour tester le code (je l'ai essayé sur quelques machines virtuelles aussi) semblent être à peu près identiques. – mentre83