表格内容在下一页上显示为淡色

问题描述 投票:0回答:1

我正在尝试使用 itextpdf 生成 PDF。当表格扩展到下一页时,颜色会变淡。假设我生成了四页PDF,那么在第一页和第四页上它没问题,但在第二页和第三页上表格内容颜色显示为褪色。请找到随附的屏幕截图。

这很奇怪,请帮助我。

以下是代码:

public class PdfGenerator {
    public static void main(String[] args) throws IOException {

        ClassPathResource resource = new ClassPathResource("PedTemplate.pdf");
        File file = new File(resource.getFile().getAbsolutePath());

        CustomPageDuplicationEventHandler z = null;

        try (PdfReader reader = new PdfReader(file);
        ) {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            PdfWriter writer = new PdfWriter(baos);
            PdfDocument destDoc = new PdfDocument(reader, writer);

            PdfReader reader2 = new PdfReader(file);
            PdfDocument srcDoc = new PdfDocument(reader2);

            z = new CustomPageDuplicationEventHandler(srcDoc);
            destDoc.addEventHandler(PdfDocumentEvent.END_PAGE, z);

            Document document = new Document(destDoc);
            document.setMargins(95, 24, 100, 24);

            srcDoc.copyPagesTo(1, 1, destDoc);

            for (int i = 0; i < 3; i++) {
                Table table2 = new Table(4);

                table2.addHeaderCell(new Cell(1, 4).add(new Paragraph("Female Head Circumference (0-36mo)")).setBold().setPaddingLeft(5).setBorderLeft(new SolidBorder(3)));
                table2.addHeaderCell(new Cell().add(new Paragraph("DATE")).setBold().setPaddingLeft(5).setBorderRight(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderBottom(Border.NO_BORDER));
                table2.addHeaderCell(new Cell().add(new Paragraph("HEAD CIRCUMFERENCE (CM)")).setBold().setPaddingLeft(5).setBorderRight(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderBottom(Border.NO_BORDER));
                table2.addHeaderCell(new Cell().add(new Paragraph("PERCENTILE")).setBold().setPaddingLeft(5).setBorderRight(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderBottom(Border.NO_BORDER)).setFontSize(7);
                table2.addHeaderCell(new Cell().add(new Paragraph("Z-SCORE")).setBold().setPaddingLeft(5).setBorderRight(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderBottom(Border.NO_BORDER));

                for (int j = 0; j < 50; j++) {
                    table2.addCell(new Cell().add(new Paragraph("mm/dd/yyyy")).setPaddingLeft(5).setBorderRight(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderTop(Border.NO_BORDER));
                    table2.addCell(new Cell().add(new Paragraph(String.valueOf(j + 1))).setPaddingLeft(5).setBorderRight(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderTop(Border.NO_BORDER));
                    table2.addCell(new Cell().add(new Paragraph("#.#%")).setPaddingLeft(5).setBorderRight(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderTop(Border.NO_BORDER)).setFontSize(8);
                    table2.addCell(new Cell().add(new Paragraph("#.##")).setPaddingLeft(5).setBorderRight(Border.NO_BORDER).setBorderLeft(Border.NO_BORDER).setBorderTop(Border.NO_BORDER));
                }

                table2.setBorder(new SolidBorder(1));
                table2.setWidth(767);
                table2.setMarginTop(20);
                document.add(table2);

            }

            destDoc.removeEventHandler(PdfDocumentEvent.END_PAGE, z);
            document.close();
            destDoc.close();

            byte[] pdfAsBytes = baos.toByteArray();

            FileOutputStream os = new FileOutputStream("FinalOutput.pdf");
            os.write(pdfAsBytes);
            os.close();

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    static class CustomPageDuplicationEventHandler implements IEventHandler {
        private final PdfDocument srcDoc;
        public CustomPageDuplicationEventHandler(PdfDocument srcDoc) {
            this.srcDoc = srcDoc;
        }

        @Override
        public void handleEvent(Event event) {
            System.out.println("Event");
            PdfDocumentEvent docEvent = (PdfDocumentEvent) event;
            PdfDocument pdfDoc = docEvent.getDocument();
            PdfPage originalPage = srcDoc.getPage(1);
            pdfDoc.addPage(originalPage.copyTo(pdfDoc));
        }
    }
}

我想使用一个ODF模板,它只有一个页面,所以我需要复制该页面,但事件监听器没有复制到第二页,所以第一次我手动复制页面,然后该事件监听器工作正常.

为什么显示的内容变淡了?我不明白这个。

java itext
1个回答
0
投票

这似乎是一个问题,因为您正在使用 setBold 方法。 这是一个黑客实现,可以设置粗体文本,而不需要专门的字体。

您可以尝试查看是否可以解决该问题的方法是:https://kb.itextpdf.com/itext/how-can-i-use-regular-and-bold-in-a-single-string

© www.soinside.com 2019 - 2024. All rights reserved.