当前位置: 首页 > 知识库问答 >
问题:

PDFBox API:如何改变字体以处理AcroForm字段中的西里尔值

范楚
2023-03-14
PDDocument document = PDDocument.load(file);
PDDocumentCatalog dc = document.getDocumentCatalog();
PDAcroForm acroForm = dc.getAcroForm();
PDField naziv = acroForm.getField("naziv");
naziv.setValue("Наслов"); // this part right here
naziv.setValue("Naslov"); // it works like this

共有1个答案

匡旭东
2023-03-14

下面的代码在acroform默认资源字典中添加适当的字体,并替换默认外观中的名称。PDFBox在调用setValue()时使用新字体重新创建字段的外观流。

public static void main(String[] args) throws IOException
{
    PDDocument doc = PDDocument.load(new File("ZPe.pdf"));
    PDAcroForm acroForm = doc.getDocumentCatalog().getAcroForm();
    PDResources dr = acroForm.getDefaultResources();

    // Important: the font is Type0 (allows more than 256 glyphs) and NOT SUBSETTED
    PDFont font = PDType0Font.load(doc, new FileInputStream("c:/windows/fonts/arial.ttf"), false);

    COSName fontName = dr.add(font);
    Iterator<PDField> it = acroForm.getFieldIterator();
    while (it.hasNext())
    {
        PDField field = it.next();
        if (field instanceof PDTextField)
        {
            PDTextField textField = (PDTextField) field;
            String da = textField.getDefaultAppearance();

            // replace font name in default appearance string
            Pattern pattern = Pattern.compile("\\/(\\w+)\\s.*");
            Matcher matcher = pattern.matcher(da);
            if (!matcher.find() || matcher.groupCount() < 2)
            {
                // oh-oh
            }
            String oldFontName = matcher.group(1);
            da = da.replaceFirst(oldFontName, fontName.getName());

            textField.setDefaultAppearance(da);
        }
    }
    acroForm.getField("name1").setValue("Наслов");
    doc.save("result.pdf");
    doc.close();
}

更新4.4.2019:为了节省一些空间,在调用SetValue之前删除外观可能会很有用:

acroForm.getField("name1").getWidgets().get(0).setAppearance(null);

若要检查AcroForm默认资源中是否存在未使用的字体,请参见以下答案。

 类似资料:
  • 问题内容: 我需要使用来向字段添加西里尔字母值的帮助。这是我到目前为止的内容: 当我的输入是拉丁字母时,它可以完美地工作。但是我也需要处理西里尔字母的输入。我该怎么做? ps这是我得到的异常:原因:java.lang.IllegalArgumentException:U + 043D(’afii10079’)在该字体Helvetica编码中不可用:WinAnsiEncoding 问题答案: 下面的

  • 我一直在使用PDFSharp来填充带有AcroForm字段的PDF。我可以使用以下代码设置表单字段的值: 我遇到的问题是,当我试图更改将进入字段的文本的字体时。我能够访问字段的font属性,它允许我像这样设置它: 然而,当我打开保存的PDF时,它默认字体返回到不同的字体。我也试过使用其他字体,比如“Arial”或“Helvetica”,以及不同的大小,但似乎没有一种字体能坚持。 如果我用Foxit

  • Adobe Reader无法正确显示我的PDF。对于其他PDF阅读器来说,这是一个语法问题,因为我听说Adobe Reader对PDF语法要求更严格。字体似乎是它们应该的两倍大,但水平间距是正确的,这使得字体相互重叠。 这是我的C#代码(字体创建代码在本文末尾)。

  • 如何使其在输出俄语时,输出俄语字母,而不是�� ����� �������� �����! 它不仅在控制台中工作,而且在终端中一切正常 我试过这个 > 窗口 还有这个 窗户- 还有这个 在eclipse主目录中打开eclipse.ini,或者在STS(Spring Tool Suite)的情况下打开STS. ini,将下面的行放在文件末尾-Dfile.encoding=UTF-8 但还是做不到。请

  • 问题内容: 我正在尝试使用php的函数json_encode将西里尔UTF-8数组编码为JSON字符串。示例代码如下所示: 它工作正常,但脚本的结果表示为: 每个西里尔字母组成6个字符。有没有一种方法可以获取键/值对的原始字符,而不是编码的字符? 问题答案: 您不能在此处使用JSON_UNESCAPED_UNICODE常量吗?

  • 我正在使用pdfbox 2.0.5使用以下代码填写PDF文档的表单字段: 我得到这个错误:U+0434('AFII10069')在此字体Times-Roman(泛型:TimesNewRomanPSMT)编码:StandardEncoding with Difference中不可用 我必须在文本字段中指定哪种字体来处理西里尔(或亚洲)字符? 谢谢,罗波