2017-10-20 11 views
0

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">&nbsp;</font></o:p><br /> 
    <span style="FONT-SIZE: 11pt; FONT-FAMILY: &quot;Calibri&quot;,&quot;sans-serif&quot;; mso-fareast-font-family: Calibri; mso-fareast-theme-font: minor-latin; mso-bidi-font-family: &quot;Times New Roman&quot;; 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)); 
} 

Répondre

1

Trouvé la question. Comme je le soupçonnais, c'était lié à la police.

Sur ma machine, la police Calibri peut être intégrée dans le document * .pdf, alors que sur les autres machines sa propriété "Intégrité de police" est définie sur "Restreint".

Je suppose que je vais devoir analyser le HTML et changer toutes les valeurs à l'intérieur des balises de "famille de polices" en une non-restreinte.

1

Vous devez migrer vers pdfHTML, l'extension iText7 (dernière version d'iText) qui convertit HTML en PDF. De nombreux bogues (liés aux tables, aux polices et à la mise en page en général) ont été corrigés au cours des années, donc par défaut, pdfHTML est plus susceptible de faire la conversion.

exemple de code:

HtmlConverter.convertToPdf(
    "<b>This text should be written in bold.</b>", 
    new PdfWriter(new File("C://users/mentre83/output.pdf"))); 
+0

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

+0

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. –

+0

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