【问题标题】:how to insert text field in the place of string in pdf using java如何使用java在pdf中的字符串位置插入文本字段
【发布时间】:2018-10-08 09:44:08
【问题描述】:

我目前正在使用 IText API Java 将数字签名 (DS) 插入 pdf 文档。我可以在 pdf 文档中附加 DS,但我的要求是我想在占位符(字符串)的位置插入 DS。我尝试了很多方法,但没有任何效果。有谁知道如何实现相同的......? 我尝试了另一种方法,方法是向 pdf 添加一个文本字段并使用文本字段名称在文本字段内附加一个 DS。但同样的问题是我无法在字符串的位置添加文本字段。如何在所需位置在 pdf 中添加文本字段...?(即我想用文本字段替换字符串)这可能吗...?有谁知道如何在 java 中创建 new Rectangle() at占位符的位置(字符串或文本)。

【问题讨论】:

  • 在 pdf 中添加文本字段?你想做什么?
  • 假设我有一个 pdf 并且在 pdf 的第一页有一个名为 ds 的文本。我想用文本字段替换文本,以便我可以在文本字段中插入 DS。
  • 首先PDF不是写作的东西,它是文件的文件格式,就像.doc等一样
  • @MurtazaKhursheedHussain 我知道,但可以这样做吗...?
  • 简短回答,否

标签: javascript java pdf itext digital-signature


【解决方案1】:

使用字段创建类 TextRenderInfoObject

private String text;
private TextRenderInfo line;

添加所有构造函数、getter 和 setter。

获取文本的坐标(占位符)

PdfReader reader = new PdfReader(byteArrayOutputStream.toByteArray());  
List<TextRenderInfoObject> textRenderInfos = new ArrayList<>();  
PdfReaderContentParser parser = new PdfReaderContentParser(reader);  
parser.processContent(pageNumber, new TextMarginFinder()
{
    @Override  
    public void renderText(TextRenderInfo renderInfo)
    {  
        if("dstext".contains(renderInfo.getText()))
        {  
            textRenderInfos.add(new TextRenderInfoObject(  
            renderInfo.getText(), renderInfo));
        }
    }
}

Rectangle2D.Float line;  
for (TextRenderInfoObject textRenderInfo : textRenderInfos)  
{
    if (textRenderInfo.getText().equals("dstext"))  
        line = textRenderInfo.getLine().getBaseline().getBoundingRectange());
} 

在 pdf 中创建表单域

PdfReader pdfReader = new PdfReader(byteArrayOutputStream.toByteArray());
PdfStamper stamper = new PdfStamper(pdfReader, byteArrayOutputStream);  
PdfFormField field = PdfFormField.createSignature(stamper.getWriter()); 
field.setFieldName("Digital Signature");
field.setWidget(new Rectangle(line.x, line.y, line.x + line.width, line.y - line.height), PdfAnnotation.HIGHLIGHT_OUTLINE);
field.setFlags(PdfAnnotation.FLAGS_PRINT);  
field.setColor(BaseColor.WHITE);  
field.setMKBorderColor(BaseColor.BLACK);  
stamper.addAnnotation(field, pageNumber);  
stamper.close();

【讨论】:

  • 不仅仅是格式问题,至少有一行的一部分丢失了。
  • 找到要插入表单域的占位符的坐标。以Rectangle2D.Float的形式存储。可以使用 TextRenderInfoObject 来完成。我无法在此处复制粘贴代码。如何在此编辑器中格式化 java 代码。
  • "如何在此编辑器中格式化 java 代码。" - 缩进至少 4 个空格或 1 个制表符。我为你做了那个,但你最初的代码缺少一些东西。
  • @mkl 最终格式化文本。尝试它肯定会起作用
  • " 它肯定会工作" - 嗯,并不总是因为通过renderText 回调报告的文本块可能比占位符“dstext”(使renderText 中的检查失败)或更短(使for 循环中的检查失败),或者甚至可能只是重叠其中的一部分(使上述两项检查都失败)。不过,对于足够简单的 PDF,它可以工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2017-05-16
  • 1970-01-01
  • 2018-12-23
  • 2012-01-21
  • 2012-12-01
相关资源
最近更新 更多