如何使用iText在小尺寸页面中放置文本和图像

时间:2016-08-29 10:00:10

标签: java itext

我需要制作一个看起来像这样的PDF页面:

Desired output

我在制作适合小尺寸页面的两列时遇到问题。

这是我的代码:

public void createSizedPdf(String dest) throws IOException, DocumentException {

        Document document = new Document();
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));        
        document.setMargins(5,5,5,5);
        Rectangle one = new Rectangle(290,100);
        one.setBackgroundColor(Color.YELLOW);        
        document.setPageSize(one);
        document.open();

        Paragraph consigneeName = new Paragraph("Ahmed");
        Paragraph address = new Paragraph("Casa ST 121");
        String codeBL = "14785236987541"; 

        PdfContentByte cb = writer.getDirectContent();

        Barcode128 code128 = new Barcode128();
        code128.setBaseline(9);
        code128.setSize(9);
        code128.setCode(codeBL);
        code128.setCodeType(Barcode128.CODE128);
        Image code128Image = code128.createImageWithBarcode(cb, null, null);
        Paragraph right = new Paragraph();
        right.add(consigneeName);
        right.add(address);
        right.add(code128Image);

        Chunk glue = new Chunk(new VerticalPositionMark());
        Paragraph p = new Paragraph();
        p.add(right);
        p.add(new Chunk(glue));
        p.add(code128Image);

       document.add(p); 
       document.close();
    }

1 个答案:

答案 0 :(得分:0)

解决问题的一种方法是使用AcroForm字段创建模板PDF。您可以手动创建一个漂亮的设计,然后通过将数据(文本,条形码)放在由充当占位符的字段定义的适当位置以编程方式填写表单。

另一种方法是从头开始创建PDF,这是您似乎采用的方法,查看您的代码。

在您分享代码的意义上,您的问题并不完全清楚,但您没有解释您遇到的问题。正如我已经评论过的那样:

  

你无法缩放图像吗?你不能定义一个更小的   字体大小?您是否无法创建具有特定维度的表格?   你说我在制作两个适合小的柱子方面遇到了问题   大小的页面,但你忘了描述问题。

你没有回答这些问题,这使得某人很难回答你的问题。 Stack Overflow阅读器唯一可以做的就是在你的位置完成你的工作。这不是Stack Overflow的用途。

此外,您的问题的答案非常简单,Stack Overflow读者很难理解您发布问题的原因。

你说你需要在两列中添加数据(文本和条形码),实际上是说你要创建一个表。这是这样一个表的一个例子:

enter image description here

如果查看SmallTable示例,您可以看到它是如何构建的。

您想要一个测量290 x 100个用户单位的PDF,每边的边距为5个用户单位。这意味着您有一个表格空间可容纳280个用户单位。看一下你的屏幕截图,我会说你有一个包含160个用户单元的列和一个包含120个用户单元的列。我还说你有三行,每行30个用户单位。

好的,那你为什么不根据这些尺寸创建一个表呢?

public void createPdf(String dest) throws IOException, DocumentException {
    Rectangle small = new Rectangle(290,100);
    Font smallfont = new Font(FontFamily.HELVETICA, 10);
    Document document = new Document(small, 5, 5, 5, 5);
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(dest));
    document.open();
    PdfPTable table = new PdfPTable(2);
    table.setTotalWidth(new float[]{ 160, 120 });
    table.setLockedWidth(true);
    PdfContentByte cb = writer.getDirectContent();
    // first row
    PdfPCell cell = new PdfPCell(new Phrase("Some text here"));
    cell.setFixedHeight(30);
    cell.setBorder(Rectangle.NO_BORDER);
    cell.setColspan(2);
    table.addCell(cell);
    // second row
    cell = new PdfPCell(new Phrase("Some more text", smallfont));
    cell.setFixedHeight(30);
    cell.setVerticalAlignment(Element.ALIGN_MIDDLE);
    cell.setBorder(Rectangle.NO_BORDER);
    table.addCell(cell);
    Barcode128 code128 = new Barcode128();
    code128.setCode("14785236987541");
    code128.setCodeType(Barcode128.CODE128);
    Image code128Image = code128.createImageWithBarcode(cb, null, null);
    cell = new PdfPCell(code128Image, true);
    cell.setBorder(Rectangle.NO_BORDER);
    cell.setFixedHeight(30);
    table.addCell(cell);
    // third row
    table.addCell(cell);
    cell = new PdfPCell(new Phrase("and something else here", smallfont));
    cell.setBorder(Rectangle.NO_BORDER);
    cell.setHorizontalAlignment(Element.ALIGN_RIGHT);
    table.addCell(cell);
    document.add(table);
    document.close();
}

在此示例中,

  • 您将学习如何更改单元格中内容的字体,
  • 您将学习如何更改水平和垂直对齐方式,
  • 您将学习如何缩放条形码以使其适合单元格,
  • ...

官方文档中解释了所有这些功能。正如我之前所说:你没有解释你问题的本质。文档中有什么不清楚的地方?你有什么问题?