iText-Java Android-将字段添加到现有的pdf

帕斯奎尔·科伦丁(Pasquier Corentin)

我试图将交互式字段添加到现有的PDF中,我使用PdfReader和PdfStamper来做到这一点,当我在平板电脑上打开它时,一切正常。但是,当我想在计算机上打开它时,没有任何字段。

这是我的代码的示例,我每页有多个字段,但是我在这里只打印了两个字段:

public class SelfNoteFragment extends Fragment {
    private PdfStamper pdfStamper;

    class MyCellField implements PdfPCellEvent {
        protected String fieldname;
        protected int page;
        public MyCellField(String fieldname, int page) {
            this.fieldname = fieldname;
            this.page = page;
        }
        public void cellLayout(PdfPCell cell, Rectangle rectangle, PdfContentByte[] canvases) {
            final PdfWriter writer = canvases[0].getPdfWriter();
            final TextField textField = new TextField(writer, rectangle, fieldname);
            try {
                final PdfFormField field = textField.getTextField();
                pdfStamper.addAnnotation(field, page);
            } catch (final IOException ioe) {
                throw new ExceptionConverter(ioe);
            } catch (final DocumentException de) {
                throw new ExceptionConverter(de);
            }
        }
    }

    class CheckboxCellEvent implements PdfPCellEvent {
        protected String name;
        protected boolean check;
        protected int page;

        public CheckboxCellEvent(String name, boolean check, int page) {
            this.check = check;
            this.name = name;
            this.page = page;
        }

        public void cellLayout(PdfPCell cell, Rectangle position,
                               PdfContentByte[] canvases) {
            PdfWriter writer = canvases[0].getPdfWriter();
            float x = position.getLeft();
            float y = position.getBottom();
            Rectangle rect = new Rectangle(x-5, y-5, x+5, y+5);
            RadioCheckField checkbox = new RadioCheckField(
                    writer, rect, name, "Yes");
            checkbox.setCheckType(RadioCheckField.TYPE_CROSS);
            checkbox.setChecked(check);
            try {
                pdfStamper.addAnnotation(checkbox.getCheckField(), page);
            } catch (Exception e) {
                throw new ExceptionConverter(e);
            }
        }
    }

    private void createPdf(int idPrevision) throws FileNotFoundException, DocumentException {

        try {
            PdfReader pdfReader = new PdfReader("/storage/emulated/0/Documents/fiche_chantier2.pdf");

            //Create time stamp
            Date date = new Date() ;
            String timeStamp = new SimpleDateFormat("yyyyMMdd_HHmmss").format(date);

            File pdfFolder = new File(Environment.getExternalStoragePublicDirectory(
                    Environment.DIRECTORY_DOCUMENTS), "Prevision_");
            if (!pdfFolder.exists()) {
                pdfFolder.mkdir();
            }

            File myFile = new File(pdfFolder + timeStamp + ".pdf");

            OutputStream output = new FileOutputStream(myFile);

            this.pdfStamper = new PdfStamper(pdfReader, output);

            PdfContentByte canvas1;
            PdfContentByte canvas2;

            canvas1 = pdfStamper.getOverContent(1);
            canvas2 = pdfStamper.getOverContent(2);

            PdfPCell cellFillFieldPage1 = new PdfPCell();
            cellFillFieldPage1.setCellEvent(new MyCellField("", 1));
            cellFillFieldPage1.setFixedHeight(15);
            cellFillFieldPage1.setBorder(Rectangle.NO_BORDER);
            cellFillFieldPage1.setVerticalAlignment(Element.ALIGN_MIDDLE);

            PdfPCell cellCheckBoxPage2 = new PdfPCell();
            cellCheckBoxPage2.setCellEvent(new CheckboxCellEvent("", false, 2));
            cellCheckBoxPage2.setBorder(Rectangle.NO_BORDER);

            // ************** PAGE 1 ************** //

            // SET TABLE
            PdfPTable tableSection1Page1 = new PdfPTable(1);
            tableSection1Page1.setTotalWidth(136);
            tableSection1Page1.setWidthPercentage(100.0f);
            tableSection1Page1.setLockedWidth(true);

            // ADD CELLS TO TABLE
            tableSection1Page1.addCell(cellFillFieldPage1);


            // PRINT TABLES
            tableSection1Page1.writeSelectedRows(0, -1, 165, 730, canvas1);


            // ************ PAGE 2 ************ //

            // SET TABLES
            PdfPTable tableSection1Page2 = new PdfPTable(1);
            tableSection1Page2.setTotalWidth(10);
            tableSection1Page2.setWidthPercentage(100.0f);
            tableSection1Page2.setLockedWidth(true);

            // ADD CELLS TO TABLE
            tableSection1Page2.addCell(cellCheckBoxPage2);

            // PRINT TABLES
            tableSection1Page2.writeSelectedRows(0, -1, 182, 736, canvas2);

            // I tried this, but it didn't change anything
            pdfStamper.setFormFlattening(false);

            pdfStamper.close();
            pdfReader.close();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }
     }
}

您是否有一个想法,为什么我创建的PDF在平板电脑上而不在计算机上很好(当我想通过邮件发送它时)?如果是这样,您知道如何解决此问题吗?

谢谢你,科伦丁

mkl

您的代码中实际上有两个问题,

  1. 您使用空名称创建字段:

    cellFillFieldPage1.setCellEvent(new MyCellField("", 1));
    ...
    cellCheckBoxPage2.setCellEvent(new CheckboxCellEvent("", false, 2));
    

    首先,字段必须有一个名称。而且,即使允许使用空名称作为名称,也可以将两个具有相同名称的字段视为同一抽象字段的两种表示形式,如果一个是文本字段,而另一个是复选框字段,则很难理解。

    用非空的,不同的名称命名这些字段后,您会看到在Adobe Reader DC / Win上具有字段:您可以使用TAB键在它们之间进行制表并更改其值。但是,不幸的是,它们是无边界的,因此,如果为空则很难发现。这是因为

  2. 您没有为字段设置边框颜色。因此,iText创建了无边框的表单域外观流。

    您可以这样设置边框颜色:

    ...
    final TextField textField = new TextField(writer, rectangle, fieldname);
    textField.setBorderColor(BaseColor.BLACK);
    ...
    RadioCheckField checkbox = new RadioCheckField(writer, rect, name, "Yes");
    checkbox.setBorderColor(BaseColor.BLACK);
    ...
    

    这样做之后,您将获得带有黑色边框的字段...


如果您想知道为什么不同的观众(即使是同名公司的同一个观众)在这里的行为也有所不同...

  1. 一些PDF查看者很早就意识到他们无法正确处理具有空名称的字段,因此甚至不显示它们,而其他查看者则稍后又在尝试保存或发布表单时意识到这一点,或者根本不认识它,产生损坏的输出。

  2. 允许PDF查看者忽略表单字段的外观流(实际上通常是注释),并创建自己的外观。因此,在他们眼前的情况下,他们可能会忽略iText生成的无边界外观,并绘制具有可见边框的外观。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

iText Android-将文本添加到现有的PDF

来自分类Dev

如何使用iText以编程方式将页眉和页脚添加到现有的基于表单的PDF中?

来自分类Dev

在Android中将图像添加到iText pdf

来自分类Dev

使用Java使用iText将多个图像添加到单个pdf文件中

来自分类Dev

使用itext java和html将锚点添加到pdf

来自分类Dev

如何使用带有 C# 的 itext7 将 u3d 添加到现有的 pdf 中

来自分类Dev

Java使用itext在现有的pdf中设置本地文件超链接

来自分类Dev

使用Java IText为现有的PDF文档设置新页面大小

来自分类Dev

itext从现有的pdf获取字段坐标

来自分类Dev

itext从现有的pdf获取字段坐标

来自分类Dev

itext从现有的pdf获取字段坐标

来自分类Dev

如何将监视模块添加到现有的Android Studio项目中?

来自分类Dev

将LibGDX添加到现有的Android Studio项目中

来自分类Dev

我可以将Navigationdrawer添加到现有的Android项目吗?

来自分类Dev

如何将libgdx添加到现有的android studio项目中?

来自分类Dev

如何在Java中使用Itext将页眉和页脚添加到我的PDF中

来自分类Dev

如何在Java中使用Itext将页眉和页脚添加到我的PDF中

来自分类Dev

如何将现有的Eclipse Java项目添加到git

来自分类Dev

使用 java 将 JSON 对象添加到现有的 JSON 数组中

来自分类Dev

如何使用 C# 将嵌套表添加到 iText 中的现有 PDF 表中

来自分类Dev

在同一页面上将表添加到现有PDF-ITEXT

来自分类Dev

在iText7(.NET)中将页脚添加到现有PDF的每一页

来自分类Dev

使用pdfstamper(Itext)将页码添加到pdf

来自分类Dev

使用itext将边框添加到pdf页面

来自分类Dev

将空白添加到iText PDF块

来自分类Dev

使用itext将签名添加到pdf

来自分类Dev

读取PDF时出现IText OutOfMemoryError(Android)

来自分类Dev

将现有活动添加到 TabActivity Android

来自分类Dev

Java AWT将元素添加到现有框架

Related 相关文章

  1. 1

    iText Android-将文本添加到现有的PDF

  2. 2

    如何使用iText以编程方式将页眉和页脚添加到现有的基于表单的PDF中?

  3. 3

    在Android中将图像添加到iText pdf

  4. 4

    使用Java使用iText将多个图像添加到单个pdf文件中

  5. 5

    使用itext java和html将锚点添加到pdf

  6. 6

    如何使用带有 C# 的 itext7 将 u3d 添加到现有的 pdf 中

  7. 7

    Java使用itext在现有的pdf中设置本地文件超链接

  8. 8

    使用Java IText为现有的PDF文档设置新页面大小

  9. 9

    itext从现有的pdf获取字段坐标

  10. 10

    itext从现有的pdf获取字段坐标

  11. 11

    itext从现有的pdf获取字段坐标

  12. 12

    如何将监视模块添加到现有的Android Studio项目中?

  13. 13

    将LibGDX添加到现有的Android Studio项目中

  14. 14

    我可以将Navigationdrawer添加到现有的Android项目吗?

  15. 15

    如何将libgdx添加到现有的android studio项目中?

  16. 16

    如何在Java中使用Itext将页眉和页脚添加到我的PDF中

  17. 17

    如何在Java中使用Itext将页眉和页脚添加到我的PDF中

  18. 18

    如何将现有的Eclipse Java项目添加到git

  19. 19

    使用 java 将 JSON 对象添加到现有的 JSON 数组中

  20. 20

    如何使用 C# 将嵌套表添加到 iText 中的现有 PDF 表中

  21. 21

    在同一页面上将表添加到现有PDF-ITEXT

  22. 22

    在iText7(.NET)中将页脚添加到现有PDF的每一页

  23. 23

    使用pdfstamper(Itext)将页码添加到pdf

  24. 24

    使用itext将边框添加到pdf页面

  25. 25

    将空白添加到iText PDF块

  26. 26

    使用itext将签名添加到pdf

  27. 27

    读取PDF时出现IText OutOfMemoryError(Android)

  28. 28

    将现有活动添加到 TabActivity Android

  29. 29

    Java AWT将元素添加到现有框架

热门标签

归档