使表格的可编辑单元格仅具有带有迭代

时间:2015-05-06 16:52:12

标签: itext

请找到以下代码。

public class MakingFieldReadOnly implements PdfPCellEvent {

    /** The resulting PDF. */
    public static final String RESULT1 = "text_fields.pdf";
    /** The resulting PDF. */
    public static final String RESULT2 = "text_filled.pdf";
    /** The text field index of a TextField that needs to be added to a cell. */
    protected int tf;

    public static final String CONTENT = "Write any thing so that it exceeds the content limit of the textfield and scroll bar comes. asdadasdasdasdasdasdasdasdasddlfjklfjljdflkjasdfjasdfjsldfjlsdjflsjdfljdflkjsdfljsldfjlsdjflskdfjlskdfjlsdjflskdjflksdjflksdjflkjsdflkjsdfljsdfkljsdlfjlsdjkfasdadasdasdasdasdasdasdasdasddlfjklfjljdflkjasdfjasdfjsldfjlsdjflsjdfljdflkjsdfljsldfjlsdjflskdfjlskdfjlsdjflskdjflksdjflksdjflkjsdflkjsdfljsdfkljsdlfjlsdjkfasdadasdasdasdasdasdasdasdasddlfjklfjljdflkjasdfjasdfjsldfjlsdjflsjdfljdflkjsdfljsldfjlsdjflskdfjlskdfjlsdjflskdjflksdjflksdjflkjsdflkjsdfljsdfkljsdlfjljkf";
    /**
     * Creates a cell event that will add a text field to a cell.
     * @param tf a text field index.
     */
    public MakingFieldReadOnly(int tf) {
        this.tf = tf;
    }

    /**
     * Manipulates a PDF file src with the file dest as result
     * @param src the original PDF
     * @param dest the resulting PDF
     * @throws IOException
     * @throws DocumentException     */
    public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        AcroFields form = stamper.getAcroFields();
        form.setField("text1_1", CONTENT);
        form.setField("text1_2", CONTENT);
        form.setField("text1_3", CONTENT);
        form.setField("text1_4", CONTENT);

        form.setFieldProperty("text1_1","setfflags",TextField.READ_ONLY , null);
        form.setFieldProperty("text1_2","setfflags",TextField.READ_ONLY , null);
        form.setFieldProperty("text1_3","setfflags",TextField.READ_ONLY , null);
        form.setFieldProperty("text1_4","setfflags",TextField.READ_ONLY , null);
        stamper.close();
        //reader.close();
    }

    /**
     * Creates a PDF document.
     * @param filename the path to the new PDF document
     * @throws    DocumentException
     * @throws    IOException
     */
    public void createPdf(String filename) throws DocumentException, IOException {
        // step 1
        Document document = new Document();
        // step 2
        PdfWriter.getInstance(document, new FileOutputStream(filename));
        // step 3
        document.open();
        // step 4
        PdfPCell cell;
        PdfPTable table = new PdfPTable(2);
        table.setWidths(new int[]{ 1, 2 });

        table.addCell("Name:");
        cell = new PdfPCell();
        cell.setCellEvent(new MakingFieldReadOnly(1));
        cell.setFixedHeight(60);
        table.addCell(cell);

        table.addCell("Loginname:");
        cell = new PdfPCell();
        cell.setCellEvent(new MakingFieldReadOnly(2));
        cell.setFixedHeight(60);
        table.addCell(cell);

        table.addCell("Password:");
        cell = new PdfPCell();
        cell.setCellEvent(new MakingFieldReadOnly(3));
        cell.setFixedHeight(60);
        table.addCell(cell);

        table.addCell("Reason:");
        cell = new PdfPCell();
        cell.setCellEvent(new MakingFieldReadOnly(4));
        cell.setFixedHeight(60);
        table.addCell(cell);

        document.add(table);
        // step 5
        document.close();

    }

    /**
     * Creates and adds a text field that will be added to a cell.
     * @see com.itextpdf.text.pdf.PdfPCellEvent#cellLayout(com.itextpdf.text.pdf.PdfPCell,
     *      com.itextpdf.text.Rectangle, com.itextpdf.text.pdf.PdfContentByte[])
     */
    public void cellLayout(PdfPCell cell, Rectangle rectangle, PdfContentByte[] canvases) {
        PdfWriter writer = canvases[0].getPdfWriter();
        TextField text = new TextField(writer, rectangle, String.format("text1_%s",tf));
        text.setBackgroundColor(new GrayColor(0.75f));
        text.setOptions(TextField.MULTILINE | TextField.REQUIRED);
        text.setBorderStyle(PdfBorderDictionary.STYLE_BEVELED);
        text.setFontSize(8);

        try {
            PdfFormField field = text.getTextField();
            writer.addAnnotation(field);
        }
        catch(IOException ioe) {
            throw new ExceptionConverter(ioe);
        }
        catch(DocumentException de) {
            throw new ExceptionConverter(de);
        }
    }

    /**
     * Main method
     * @param args no arguments needed
     * @throws IOException
     * @throws DocumentException
     */
    public static void main(String[] args) throws DocumentException, IOException {
        MakingFieldReadOnly example = new MakingFieldReadOnly(0);
        example.createPdf(RESULT1);
        example.manipulatePdf(RESULT1, RESULT2);
    }
}

请运行上面的代码并生成文档。我使用了itext-1.3.jar,但是在itext-5.3.5.jar中显示了相同的行为。

在名为“text_filled.pdf”的第二个文件中,表格中有四个pdf单元格(字段)。我的代码是将这些可编辑字段设为只读,但我也想要滚动条(当内容超出字段限制时),就像它仅为第4个字符一样,这​​样用户就可以在没有编辑权限的情况下查看整个内容。

对于表格的每个单元格,我是否可以使用滚动条(如果内容超过文本字段的限制)获得只读模式。

我也尝试过以下代码,使字段只读。

form.setFieldProperty("text1_1","setfflags",PdfFormField.FF_READ_ONLY , null);
form.setFieldProperty("text1_2","setfflags",PdfFormField.FF_READ_ONLY , null);
form.setFieldProperty("text1_3","setfflags",PdfFormField.FF_READ_ONLY, null);
form.setFieldProperty("text1_4","setfflags",PdfFormField.FF_READ_ONLY , null);

如果从这些代码中无法完成任何其他可能的解决方案。

1 个答案:

答案 0 :(得分:2)

我已经尝试过您的示例,并且我发现您遇到的行为是由Adobe Acrobat / Reader中的错误引起的。当不同文本字段的窗口小部件注释的边框重叠时,会发生错误。

一旦我确定不同字段之间没有重叠,就会出现滚动条。

我如何确保没有重叠?只需更改TextField方法中创建的cellLayout()实例的方式:

Rectangle rect = new Rectangle(
    rectangle.getLeft(), rectangle.getTop() - 1,
    rectangle.getRight(), rectangle.getBottom() + 1);
TextField text = new TextField(writer, rect, String.format("text1_%s",tf));

现在,定义文本字段的矩形不再重叠,您不再遇到Adobe Acrobat / Reader错误。