Как предотвратить потерю данных внутри таблиц при конвертации Html в Pdf с использованием iText7? - PullRequest
0 голосов
/ 07 апреля 2020

Я новичок в iText7. Я использую java программу для преобразования HTML файлов в PDF. Я использовал iText's HtmlConverter, чтобы преобразовать html в список элементов, а затем создать документ макета на основе списка элементов.

  public static void createPdf(String src, String dest, ConverterProperties properties) throws IOException {  
    List<IElement> elements =
            HtmlConverter.convertToElements(new FileInputStream(src), properties);
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    pdf.setDefaultPageSize(PageSize.LEGAL.rotate());

    Document document = new Document(pdf, pdf.getDefaultPageSize(), false);                             
    for (IElement element : elements) {         
        scaleFontSizeRecursively(document, element, (float) 0.68);
        document.add((IBlockElement)element);
    }
    document.close();
}

Вывод PDF выглядит хорошо для небольших таблиц. Но если входные данные html имеют более широкие таблицы, то содержимое сокращается. Так как это приводит к потере данных, решение неприемлемо для сообщества пользователей.

Есть ли способ назначить ширину столбцов по длине контента? Обратите внимание, что между столбцами много пустого пространства, которое, как мне кажется, определяется шириной td, определенной в файле HTML. Как переопределить ширину столбца при генерации Pdf из Html с использованием iText7? Вот пример ввода HTML для воспроизведения проблемы.

<html>
 <head>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" type="text/css" href="styles/print.css">
    <link rel="stylesheet" media="print" href="styles/table.css">  
 </head> 
 <body> 
    <table style="width:99.8%; border-collapse:collapse"> 
        <tbody> 
         <tr> 
          <td colspan="21" style="vertical-align:middle"> <p style="text-indent:36pt; text-align:justify; line-height:120%; font-size:10pt"> &nbsp; </p> </td> 
         </tr> 
         <tr> 
          <td style="width:45%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:8%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:8%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:8%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:8%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:8%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="width:1%; vertical-align:middle"> <p style="font-size:10pt"> &nbsp; </p> </td> 
         </tr> 
         <tr> 
          <td style="padding:1.5pt; vertical-align:bottom"> <p style="font-size:10pt"> House Income </p> </td> 
          <td style="padding:1.5pt; vertical-align:bottom"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="border-top:0.75pt solid #000000; padding-top:1.12pt; padding-left:1.5pt; padding-bottom:1.5pt; vertical-align:bottom"> <p style="font-size:10pt"> <strong>$</strong> </p> </td> 
          <td style="border-top:0.75pt solid #000000; padding-top:1.12pt; padding-bottom:1.5pt; vertical-align:bottom"> <p style="text-align:right; font-size:10pt"> <strong><a id="Anchor_7195" name="Anchor_7195" ng-click="list($event)">177,934<span class="icon icon-question-mark ato-blue-color" id="CFTO_ELE_ICON"></span></a></strong> </p> </td> 
          <td style="border-top:0.75pt solid #000000; vertical-align:bottom"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="padding:1.5pt; vertical-align:bottom"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="border-top:0.75pt solid #000000; padding-top:1.12pt; padding-left:1.5pt; padding-bottom:1.5pt; vertical-align:bottom"> <p style="font-size:10pt"> <strong>$</strong> </p> </td> 
          <td style="border-top:0.75pt solid #000000; padding-top:1.12pt; padding-bottom:1.5pt; vertical-align:bottom"> <p style="text-align:right; font-size:10pt"> <strong><a id="Anchor_7196" name="Anchor_7196" ng-click="list($event)">189,582<span class="icon icon-question-mark ato-blue-color" id="CFTO_ELE_ICON"></span></a></strong> </p> </td> 
          <td style="border-top:0.75pt solid #000000; vertical-align:bottom"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="padding:1.5pt; vertical-align:bottom"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="border-top:0.75pt solid #000000; padding-top:1.12pt; padding-left:1.5pt; padding-bottom:1.5pt; vertical-align:bottom"> <p style="font-size:10pt"> <strong>$</strong> </p> </td> 
          <td style="border-top:0.75pt solid #000000; padding-top:1.12pt; padding-bottom:1.5pt; vertical-align:bottom"> <p style="text-align:right; font-size:10pt"> <strong><a id="Anchor_7197" name="Anchor_7197" ng-click="list($event)">198,377<span class="icon icon-question-mark ato-blue-color" id="CFTO_ELE_ICON"></span></a></strong> </p> </td> 
          <td style="border-top:0.75pt solid #000000; vertical-align:bottom"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="padding:1.5pt; vertical-align:bottom"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="border-top:0.75pt solid #000000; padding-top:1.12pt; padding-left:1.5pt; padding-bottom:1.5pt; vertical-align:bottom"> <p style="font-size:10pt"> <strong>$</strong> </p> </td> 
          <td style="border-top:0.75pt solid #000000; padding-top:1.12pt; padding-bottom:1.5pt; vertical-align:bottom"> <p style="text-align:right; font-size:10pt"> <strong><a id="Anchor_7198" name="Anchor_7198" ng-click="list($event)">210,103<span class="icon icon-question-mark ato-blue-color" id="CFTO_ELE_ICON"></span></a></strong> </p> </td> 
          <td style="border-top:0.75pt solid #000000; vertical-align:bottom"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="padding:1.5pt; vertical-align:bottom"> <p style="font-size:10pt"> &nbsp; </p> </td> 
          <td style="border-top:0.75pt solid #000000; padding-top:1.12pt; padding-left:1.5pt; padding-bottom:1.5pt; vertical-align:bottom"> <p style="font-size:10pt"> <strong>$</strong> </p> </td> 
          <td style="border-top:0.75pt solid #000000; padding-top:1.12pt; padding-bottom:1.5pt; vertical-align:bottom"> <p style="text-align:right; font-size:10pt"> <strong><a id="Anchor_7199" name="Anchor_7199" ng-click="list($event)">775,996<span class="icon icon-check ato-green-color" id="CFTO_ELE_ICON"></span><span class="icon-stm-view-formula" id="CFTO_FORMULA_ICON">F&nbsp;</span><span class="icon-stm-wp-reference" id="CFTO_WP_ICON">100011, 100012,100013, 00014,100015,100016</span></a></strong> </p> </td> 
          <td style="border-top:0.75pt solid #000000; vertical-align:bottom"> <p style="font-size:10pt"> &nbsp; </p> </td> 
         </tr>      
        </tbody> 
       </table>
  </body>
</html>
...