Skip to content

Commit c9620ad

Browse files
fix: Columns overrun in PDF Reports (#1219)
* fix: columns overrun in PDF report * fix: columns overrun in PDF reports (#1207) fixes #1207
1 parent 323809e commit c9620ad

File tree

2 files changed

+40
-3
lines changed

2 files changed

+40
-3
lines changed

cve_bin_tool/output_engine/__init__.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,7 @@ def output_pdf(
146146
"Productlist",
147147
["Vendor", "Product", "Version", "CVE Number", "Severity"],
148148
pdfdoc.tblStyle,
149+
[10, 10, None, None, None],
149150
)
150151
row = 1
151152
star_warn = False
@@ -176,7 +177,7 @@ def output_pdf(
176177
)
177178
row += 1
178179

179-
pdfdoc.showtable("Productlist", widths=[3 * cm, 2 * cm, 2 * cm, 4 * cm, 3 * cm])
180+
pdfdoc.showtable("Productlist", widths=[3 * cm, 3 * cm, 2 * cm, 4 * cm, 3 * cm])
180181
pdfdoc.paragraph("* vendors guessed by the tool") if star_warn else None
181182

182183
pdfdoc.pagebreak()

cve_bin_tool/output_engine/pdfbuilder.py

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,8 @@ def __init__(self, includeTOC=True):
149149
self.toc.levelStyles = [self.toc_h1, self.toc_h2]
150150
self.headingnumber = [0, 0, 0, 0]
151151
self.table_data = []
152+
self.note_data = []
153+
self.table_validation = None
152154

153155
def _spacer(self):
154156
self.contents.append(self.spacer)
@@ -187,18 +189,43 @@ def paragraph(self, text, style=None):
187189
self.contents.append(Paragraph(text, style))
188190
self._spacer()
189191

190-
def createtable(self, ident, header, style):
192+
def createtable(self, ident, header, style, validation=None):
191193
# Layout is [headings, ....]
192194
self.table_data = []
193195
self.table_style = style
194196
self.table_ident = ident
197+
# Validation is list of items indicating max length of item in each column.
198+
# None indicates no limit for column
199+
if validation is not None:
200+
# Assume validation for all columns provided
201+
self.table_validation = validation
202+
else:
203+
# No validation specified
204+
self.table_validation = [None] * len(header)
195205
if header:
196206
self.addrow(ident, header)
197207

208+
def validatedata(self, data):
209+
i = 0
210+
newdata = []
211+
for d in data:
212+
if self.table_validation[i] is not None:
213+
# Column size validation
214+
if len(d) > self.table_validation[i]:
215+
if d not in self.note_data:
216+
self.note_data.append(d)
217+
newdata.append("Note " + str(self.note_data.index(d) + 1))
218+
else:
219+
newdata.append(d)
220+
else:
221+
newdata.append(d)
222+
i += 1
223+
return newdata
224+
198225
def addrow(self, ident, data, style=None):
199226
# Add row to table
200227
if self.table_ident == ident:
201-
self.table_data.append(data)
228+
self.table_data.append(self.validatedata(data))
202229
if style != None:
203230
for s in style:
204231
# Only take first 4 parameters in each style setting
@@ -211,6 +238,15 @@ def showtable(self, ident, widths=None):
211238
tbl.setStyle(self.table_style)
212239
self.contents.append(tbl)
213240
self.table_ident = None
241+
# Optional notes if data in columns truncated
242+
if len(self.note_data) > 0:
243+
notes = ["<br/><u>Notes</u>"]
244+
i = 1
245+
for d in self.note_data:
246+
notes.append(str(i) + ". " + d)
247+
i += 1
248+
self.paragraph("<br/>".join(notes))
249+
self.note_data = []
214250
self._spacer()
215251

216252
def pagebreak(self):

0 commit comments

Comments
 (0)