在 java 中使用 itext 对齐 PDF 中的内容

Align content in PDF using itext in java

这个问题困扰我有一段时间了。我正在向文档绘制 pie chart 并显示 jtable data。我无法 align pdf file 中的内容。如何将 jtable datapie chart 与此 pdf 对齐。我在下面用 image 提到了我的 code 如您所见,我需要将我的 jtable data 稍微对齐到顶部,并且它还必须适合 page.

width
     private void graphical_to_pdf() {

    graph_table.setSize(graph_table.getPreferredSize());

    JTableHeader th = graph_table.getTableHeader();
    th.setSize(th.getPreferredSize());

    PdfDestination pdfDest = new PdfDestination(PdfDestination.XYZ, 800, 800, 0.65f);
    com.itextpdf.text.Font f = new com.itextpdf.text.Font(com.itextpdf.text.Font.FontFamily.TIMES_ROMAN, 18.0f, com.itextpdf.text.Font.NORMAL, BaseColor.BLACK);

    Document doc = new Document(new com.itextpdf.text.Rectangle(900, 900));

    //Creating a paper to store the jtable contents
    Paper paper = new Paper();

    paper.setSize(800, 800);
    paper.setImageableArea(0, 100, 800, 800);

    PageFormat pf = new PageFormat();
    pf.setPaper(paper);
    Printable printable = graph_table.getPrintable(JTable.PrintMode.NORMAL, null, null);

    try {
        PdfWriter writer;
        writer = PdfWriter.getInstance(doc, new FileOutputStream(save_pdf.getSelectedFile().getAbsoluteFile() + ".pdf"));

        writer.setViewerPreferences(PdfWriter.PageLayoutSinglePage);
        doc.open();
        int width = 375;
        int height = 300;

        JFreeChart chart = create_pie_chart_count();

        doc.add(new Paragraph("Some TExt", f));
        doc.add(new Paragraph("Some Text", f));
        doc.add(new Paragraph("Document Generated On - " + generatedDate, f));
        BufferedImage bufferedImage = chart.createBufferedImage(width, height);

        Image image = Image.getInstance(writer, bufferedImage, 1.0f);
        image.scalePercent(100f);
        image.setAlignment(image.MIDDLE);
        doc.add(image);
        PdfAction action = PdfAction.gotoLocalPage(1, pdfDest, writer);
        writer.setOpenAction(action);

            BufferedImage img = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);

        Graphics2D g = img.createGraphics();

        int page = 0;

        int result = Printable.NO_SUCH_PAGE;

        PdfContentByte cb = writer.getDirectContent();
        do {
            result = printable.print(g, pf, page);
            if (result == Printable.PAGE_EXISTS) {
                cb.saveState();
                Graphics2D g2 = cb.createGraphics(650, 225);
                result = printable.print(g2, pf, page);
                g2.dispose();
                cb.restoreState();
                page++;
                doc.newPage();

            }

        } while (result == Printable.PAGE_EXISTS);
        g.dispose();
    } catch (Exception e) {
    } finally {
        doc.close();
    }
}

查看以下问题的答案:How to position a PDFGraphis2D object in iText?

如您所见,通常而不是 将图表或table 等对象直接绘制到直接内容。相反,您应该创建一个 PdfTemplate 来绘制。使用 PdfTemplate 的好处之一是您可以将其包装在 Image 中。不用担心:如果 PdfTemplate 包含矢量数据,则 Image 将是矢量图像;它不会被光栅化(这会导致分辨率下降)。

拥有 Image 个对象后,可以使用许多不同的选项来调整它们的大小、位置和组织它们。阅读以下问题的答案时,您可以了解不同的选项:

  • How to display image and text beside each other Itext
  • itextsharp images are not coming next to one another
  • Add text and an alligned image to a ColumnText Itext
  • ...