如何添加多个文本字段中单个或多个页面中环

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

我利用iText 5个Maven和我要在多个PDF页面添加多个文本框。像页面1需要3个字段,第2页需要4个场等等

我写了下面的代码

public byte[] setupDocument(EditPdfDTO editPdfDTOList, MultipartFile attachment)
{

    WritePDF obj = new WritePDF();

    Document document = null;
    PdfWriter writer = null;
    PdfImportedPage page = null;
    PdfReader reader = null;
    try
    {
        // Create output PDF
        document = new Document(PageSize.A4);
        document.setMargins(0, 0, 0, 0);

        writer = PdfWriter.getInstance(document,
                new FileOutputStream("D:/test.pdf"));

        document.open();
        PdfContentByte cb = writer.getDirectContent();

        // Load existing PDF
        reader = new PdfReader(attachment.getBytes());

        int totalPages = reader.getNumberOfPages();
        for (int i = 0; i < totalPages; i++)
        {
            page = writer.getImportedPage(reader, i + 1);
            document.newPage();
            cb.addTemplate(page, 0, 0);

            for (int j = 0; j < editPdfDTOList.getPdf().size(); j++)
            {
                if (i + 1 == editPdfDTOList.getPdf().get(j).getPageNo())
                {
                    BaseFont baseFont = null;
                    try
                    {
                        baseFont = BaseFont.createFont();
                    }
                    catch (DocumentException | IOException e1)
                    {
                        e1.printStackTrace();
                    }

                    int a, b;
                    a = editPdfDTOList.getPdf().get(j).getxCoordinate();
                    b = editPdfDTOList.getPdf().get(j).getyCoordinate();

                    String str = editPdfDTOList.getPdf().get(j).getTextContent();

                    Rectangle linkLocation =
                            new Rectangle(a, b + baseFont.getDescentPoint(str, 10),
                                    a + 10 + baseFont.getWidthPoint(str, 10),
                                    b + baseFont.getAscentPoint(str, 10) + 10);
                    TextField field =
                            new TextField(writer, linkLocation, "user1" + j+UUID.randomUUID());

                    field.setFontSize(10);
                    field.setOptions(TextField.MULTILINE | TextField.READ_ONLY);
                    field.setTextColor(BaseColor.RED);
                    field.setText(str);
                    field.setBorderWidth(1);

                    cb = writer.getDirectContent();

                    try
                    {
                        cb.addAnnotation(field.getTextField(),false);
                    }
                    catch (IOException | DocumentException e)
                    {
                         e.printStackTrace();           
                    }

                }
            }
        }
    }
    catch (DocumentException | IOException e)
    {
        e.printStackTrace();
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
    finally
    {
        document.close();

    }
    return null;
}

这个代码能够只添加一个文本字段上的每个预期,但不能在一个页面中添加2个或多个文本框。

没有多尝试的问题 - catch块。

spring-boot itext
1个回答
3
投票

The appropriate classes to use

首先,你说你“要在多个PDF页面添加多个文本框”。在实施这样的任务,这需要一个单一的文件,并希望以某种方式操纵它,而在结构上或多或少地保持它像以前一样,即任务,应该通常用PdfReader / PdfStamper夫妇工作。这可以让你把注意力集中在操作和提供原始的PDF与它的所有属性上工作的副本。

Adding multiple fields to a page of an existing PDF

添加多个字段到一个现有的页面是微不足道的,例如:

PdfReader pdfReader = new PdfReader(resource);
PdfStamper pdfStamper = new PdfStamper(pdfReader, output);

TextField field1 = new TextField(pdfStamper.getWriter(),
                                 new Rectangle(100, 800, 200, 820), "Field1");
field1.setBorderColor(BaseColor.CYAN);
field1.setBorderStyle(PdfBorderDictionary.STYLE_DASHED);
field1.setBorderWidth(BaseField.BORDER_WIDTH_MEDIUM);
field1.setText("Field 1");
pdfStamper.addAnnotation(field1.getTextField(), 1);

TextField field2 = new TextField(pdfStamper.getWriter(),
                                 new Rectangle(300, 800, 400, 820), "Field2");
field2.setBorderColor(BaseColor.RED);
field2.setBorderStyle(PdfBorderDictionary.STYLE_INSET);
field2.setBorderWidth(BaseField.BORDER_WIDTH_THIN);
field2.setText("Field 2");
pdfStamper.addAnnotation(field2.getTextField(), 1);

pdfStamper.close();

AddField测试testAddMultipleFields

适用于我的示例文件

screen shot original

代码生成

screen shot result

因此,添加多个文本字段相同的文档页面没有概念上的问题,它工作在一个非常自然的方式。

在你的情况我会切换到使用PdfReader / PdfStamper夫妇。如果一些问题仍然存在,我会检查你的数据。也许他们只是只包含每页单场数据集。两个文本框具有相同的坐标,因此,看起来像一个。或者一些文本字段有关闭屏幕坐标。或者......或者......或者......

The original answer

原本在问题的代码不同的眼光看。这种原始的答案集中在代码的问题。

你要求你的代码

能够只添加一个文本字段上的每个预期,但不能在一个页面中添加2个或多个文本框

我怀疑,因为

  1. 你有两个不同的对象写入同一个文件"D:/TemplateFilePDf/" + attachment.getOriginalFilename()同时,PdfWriter writerPdfStamper stamper。如果你得到的东西明智的代码,那么只有通过纯粹是运气的结果;和
  2. 另外stamper被实例化用于nullPdfReader实例。这实际上将导致这将让你的文本框从根本上被执行添加代码构造一个NullPointerException

因此,无论是您共享的代码是从运行代码相当大的不同或者您的测试实际上将运行NullPointerException所有遥,你可能发现前,破碎少版本的代码,这恰好仅添加了一个文本字段输出。

修复这两个问题之后,一些问题仍然存在(如什么是cb.fill()的用意何在?该指令只是一个路径定义,其内部区域,填补了路径后直接允许的,但我没有看到你定义的任何路径) 。

此外,您访问editPdfDTOList了很多相关的值,但我们不知道这些值。因此,我们不能运行的代码,试图重现该问题。也许你只创建一个文本框,因为这个对象仅包含一个文本框的值...

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