2011-12-20 4 views
8

Я использую iTextSharp v.4, чтобы объединить целую кучу html-файлов. Он работал нормально до тех пор, пока мне не нужно было перейти на v.5 iTextSharp.iTextSharp HTMLWorker.ParseToList() throws NullReferenceException

Проблема возникает, когда я передаю потоковое устройство (чтение содержимого файла html) в метод ParseToList объекта HTMLWorker. Он выбрасывает исключение с нулевой ссылкой. При отладке я могу получить доступ к streamReader и подтвердить, что прочитано правильное содержимое файла.

Вот код:

List<IElement> objects; 
try 
{ 
    objects = HTMLWorker.ParseToList(new StringReader(htmlString), null); 
} 
catch (Exception e) 
{ 
    htmlString = "<html><head></head><body><br/><br/><h2 style='color:#FF0000'>ERROR READING FILE!</h2><h3>File Excluded From Stitched Document!</h3><br/><br/><p>There was an error while trying to read the following file:</p><p><span style='color:#FF0000'>" + fileName + "</span></p></body></html>"; 
    objects = HTMLWorker.ParseToList(new StringReader(htmlString), null); 
} 

В блоке поймать вы увидите, что я тогда использовать практически один и тот же код, чтобы добавить текст в PDF, чтобы сказать, что была проблема. Этот код работает отлично. Это, конечно, заставляет меня думать, что проблема заключается в содержании исходного HTML строки, поэтому здесь содержание строки, как это непосредственно перед передачей в синтаксический анализатор:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> 
    <meta http-equiv="Pragma" content="no-cache" /> 
    <meta http-equiv="cache-control" content="no-cache" /> 
</head> 
<body style="font-family: Arial, Helvetica, sans-serif; font-size: 1em; margin: 0; 
    padding: 0;"> 
    <div style="font-size: 1em; line-height: 1.25em; width: 190mm;"> 
     <h1 style="font-size: 1.5em; font-weight: bold; margin: 0 0 1.5em 0; text-align: center;"> 
      Advice Item 1</h1> 
     <table border="0" style="width: 190mm; border-collapse: collapse; margin: 0 0 1.5em 0; 
      width: 100%;"> 
      <tbody> 
       <tr> 
        <td style="width: 35mm; height: 1px; line-height: 1px; font-size: 1px;"> 
         &nbsp; 
        </td> 
        <td> 
        </td> 
        <td style="width: 30mm; height: 1px; line-height: 1px; font-size: 1px;"> 
         &nbsp; 
        </td> 
        <td> 
        </td> 
       </tr> 
       <tr> 
        <td colspan="4" style="font-weight: bold;"> 
         <span id="litPatchedToCC" style="text-align: right; font-weight: bold;"></span> 
        </td> 
       </tr> 
       <tr> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
         By: 
        </th> 
        <td style="font-weight: bold; padding: 2px 5px;"> 
         ABC 
        </td> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
         From: 
        </th> 
        <td style="font-weight: bold; padding: 2px 5px;"> 
         CC 
        </td> 
       </tr> 
       <tr> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
         Date: 
        </th> 
        <td style="font-weight: bold; padding: 2px 5px;"> 
         29/03/2011 13:35 
        </td> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
         To: 
        </th> 
        <td style="font-weight: bold; padding: 2px 5px;"> 
         Member Practice 
        </td> 
       </tr> 
       <tr> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
         Folder: 
        </th> 
        <td style="font-weight: bold; padding: 2px 5px;"> 
         A15-123456 
        </td> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
         Individual: 
        </th> 
        <td style="font-weight: bold; padding: 2px 5px;"> 
         Miss A B Test 
        </td> 
       </tr> 
       <tr> 
        <td colspan="2"> 
         <hr width="100%" /> 
        </td> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
         Of: 
        </th> 
        <td style="font-weight: bold; padding: 2px 5px;"> 
         Lorem &amp; Ipsum 
        </td> 
       </tr> 
       <tr> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
         Species: 
        </th> 
        <td style="font-weight: bold; padding: 2px 5px;"> 
         Bovine 
        </td> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
         Position: 
        </th> 
        <td style="font-weight: bold; padding: 2px 5px;"> 
         Member 
        </td> 
       </tr> 
       <tr> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
         Item Type: 
        </th> 
        <td style="font-weight: bold; padding: 2px 5px;"> 
        </td> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
         Tel: 
        </th> 
        <td style="font-weight: bold; padding: 2px 5px;"> 
        
        </td> 
       </tr> 
       <tr> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
        </th> 
        <td style="font-weight: bold; padding: 2px 5px;"> 
        </td> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
         Other Nos: 
        </th> 
        <td style="font-weight: bold; padding: 2px 5px;"> 
        </td> 
       </tr> 
       <tr> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
         Reason For Call: 
        </th> 
        <td colspan="3" style="font-weight: bold; padding: 2px 5px;"> 
         Some Reason 
        </td> 
       </tr> 
       <tr> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
         Subject: 
        </th> 
        <td colspan="3" style="font-weight: bold; padding: 2px 5px;"> 
         Some problem. 
        </td> 
       </tr> 
       <tr> 
        <th scope="row" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
        </th> 
        <td> 
        </td> 
        <th scope="row" colspan="2" style="text-align: right; font-weight: normal; padding: 2px 5px;"> 
        </th> 
        <td colspan="2"> 
        </td> 
       </tr> 
       <tr> 
        <td style="font-size: 1.5em; font-weight: bold; text-align: center;" colspan="4"> 
         Internal 
        </td> 
       </tr> 
       <tr> 
        <td colspan="4" style="text-align: center; padding: 2px 5px;"> 
         <hr width="100%" /> 
        </td> 
       </tr> 
      </tbody> 
     </table> 
     <div style="padding: 2px 5px;"> 
      <p> 
       Here we start the discussion.</p> 
      <br /> 
      <p> 
       Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> 
      <br /> 
      <p> 
       Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.</p> 
     </div> 
    </div> 
</body> 
</html> 

Спасибо за любую помощь. hofnarwillie

ответ

8

Похоже, что HTMLWorker задыхается от двух <hr width="100%" />. Поскольку вы сказали, что уклоняетесь от V5.XX, неплохо было бы начать использовать XMLWorker, чтобы начать синтаксический анализ вашего HTML - команда разработчиков рекомендует его. (Последний HTMLWorker исходный код имеет даже небольшую ссылку, указывающую на это)

Испытано с расширенной HTML, это работает, и это не так уж плохо для реализации :)

using (Document document = new Document()) { 
    PdfWriter writer = PdfWriter.GetInstance(document, Response.OutputStream); 
    document.Open(); 
    try { 
    StringReader sr = new StringReader(htmlString); 
    XMLWorkerHelper.GetInstance().ParseXHtml(
     writer, document, sr 
    );   
    } 
    catch (Exception e) { 
    throw; 
    } 
} 

Испытано в веб-среде , поэтому замените Response.OutputStream на Stream по вашему выбору.

+0

Спасибо за ответ. Где определяется класс XMLWorkerHelper? Я не думаю, что у меня есть в DLL iTextSharp, который я загрузил. V 5.1.3 – hofnarwillie

+0

нашел это спасибо. Для справочных целей: http://sourceforge.net/projects/itextsharp/files/xmlworker/xmlworker-1.1.1/itextsharp.xmlworker-all-1.1.1.zip/download – hofnarwillie

+0

просто тестирование, будет отмечаться как ответ, когда это делается – hofnarwillie