gpt4 book ai didi

java - iText Android - 向现有 PDF 添加文本

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:44:04 25 4
gpt4 key购买 nike

为了收集一些数据,我们有一个包含一些字段的 PDF,我必须通过在这些位置添加一些文本,在 Android 上使用 iText 以编程方式填充它。我一直在考虑实现这一目标的不同方法,但每种方法都收效甚微。

注意:我在大部分测试中使用的是 Android 版本的 iText (iTextG 5.5.4) 和 Samsung Galaxy Note 10.1 2014 (Android 4.4)。

  • 我从一开始就采用的方法是在给定页面的给定坐标上“绘制”文本。这在字段管理方面存在一些问题(我必须知道字符串的长度,并且可能很难将每个文本定位在 pdf 的精确坐标中)。但最重要的是,该过程的性能在某些设备/OS 版本中确实很慢(它在 Nexus 5 5.0.2 中运行良好,但在 Note 10.1 上使用 5MB Pdf 需要几分钟)。

        pdfReader = new PdfReader(is);

    document = new Document();

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    pdfCopy = new PdfCopy(document, baos);
    document.open();

    PdfImportedPage page;
    PdfCopy.PageStamp stamp;

    for (int i = 1; i <= pdfReader.getNumberOfPages(); i++) {

    page = pdfCopy.getImportedPage(pdfReader, i); // First page = 1
    stamp = pdfCopy.createPageStamp(page);

    for (int i=0; i<10; i++) {
    int posX = i*50;
    int posY = i*100;
    Phrase phrase = new Phrase("Example text", FontFactory.getFont(FontFactory.HELVETICA, 12, BaseColor.RED));
    ColumnText.showTextAligned(stamp.getOverContent(), Element.ALIGN_CENTER, phrase, posX, posY, 0);
    }

    stamp.alterContents();
    pdfCopy.addPage(page);
    }
  • 我们考虑添加“表单字段”而不是绘图。这样我就可以配置一个 TextField 并避免自己管理文本。但是,最终的 PDF 不应该有任何注释,所以我需要将它复制到一个没有注释并绘制那些“表单字段”的新 Pdf 中。我没有这方面的示例,因为我无法执行此操作,我什至不知道这是否可能/是否值得。

  • 第三种选择是接收已添加“表单字段”的 Pdf,这样我只需填写它们即可。但是,我仍然需要创建一个包含所有这些字段且没有注释的新 Pdf...

我想知道执行此过程的最佳性能方式是什么,以及有关实现它的任何帮助。我真的是 iText 的新手,非常感谢任何帮助。

谢谢!

编辑

最后我使用了第三个选项:一个带有我们填充的可编辑字段的 PDF,然后我们使用“扁平化”创建一个不可编辑的 PDF,其中所有文本都已经存在。

代码如下:

    pdfReader = new PdfReader(is);

FileOutputStream fios = new FileOutputStream(outPdf);

PdfStamper pdfStamper = new PdfStamper(pdfReader, fios);
//Filling the PDF (It's totally necessary that the PDF has Form fields)
fillPDF(pdfStamper);
//Setting the PDF to uneditable format
pdfStamper.setFormFlattening(true);

pdfStamper.close();

以及填写表格的方法:

public static void fillPDF(PdfStamper stamper) throws IOException, DocumentException{
//Getting the Form fields from the PDF
AcroFields form = stamper.getAcroFields();
Set<String> fields = form.getFields().keySet();
for(String field : fields){
form.setField("name", "Ernesto");
form.setField("surname", "Lage");
}
}
}

这种方法的唯一问题是您需要知道每个字段的名称才能填写它。

最佳答案

iText 中有一个称为“扁平化”的过程,它获取表单字段,并将其替换为字段包含的文本。

我已经有几年没有使用 iText(在 Android 上也完全没有),但是如果您在手册或在线示例中搜索“扁平化”,您应该会找到如何操作。

关于java - iText Android - 向现有 PDF 添加文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28878893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com