java - 如何在 iText 5 中设置字体系列?

标签 java pdf fonts itext font-family

我不知道如何使用 iText 5 在现有 pdf 字段上简单地设置字体系列。我发现有关此问题的官方文档非常缺乏。

这是我尝试调用此字体的方式(我只想要 Helvetica,它带有 FontFactory 库):

字体 Helvetica = FontFactory.getFont("Helvetica"); form.setFieldProperty("文本字段 1", "textfont", "Helvetica", null);

当我运行上面的代码时,我收到控制台错误消息:

线程“main”java.lang.ClassCastException中出现异常:java.lang.String无法转换为com.itextpdf.text.pdf.BaseFont 在 com.itextpdf.text.pdf.AcroFields.setFieldProperty(AcroFields.java:1033) 在 com.eb.anico.web.pdf.manipulatePdf(pdf.java:87) 在 com.eb.anico.web.pdf.main(pdf.java:55)

我可以做其他事情,例如使字段成为多行、使字段居中以及更改字体颜色。但更改字体系列仍然不起作用。这是我的完整代码:

package com.pathtopackage;

import com.itextpdf.text.BaseColor;


import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.Font.FontFamily;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.Phrase;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.AcroFields;
import com.itextpdf.text.pdf.AcroFields.Item;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.FontSelector;
import com.itextpdf.text.pdf.GrayColor;
import com.itextpdf.text.pdf.PdfAction;
import com.itextpdf.text.pdf.PdfArray;
import com.itextpdf.text.pdf.PdfDictionary;
import com.itextpdf.text.pdf.PdfFormField;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfNumber;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfStamper;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.text.pdf.PushbuttonField;
import com.itextpdf.text.pdf.TextField;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;



public class pdf  {



public static final String SRC = "src/resources/ads-horizontal-box-defined-size-single-line.pdf";
   public static final String DEST = "src/resources/ads-horizontal-box-defined-size-single-line-STYLED-TXTSIZEAUTOACROBAT-7.pdf";


   public static void main(String[] args) throws DocumentException, IOException {
       File file = new File(DEST);
       file.getParentFile().mkdirs();
       new pdf().manipulatePdf(SRC, DEST);
   }

   public void manipulatePdf(String src, String dest) throws DocumentException, IOException {
       PdfReader reader = new PdfReader(src);
       PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
       AcroFields form = stamper.getAcroFields();
       Item item = form.getFieldItem("Text Field 1");


       form.setFieldProperty("Text Field 1", "fflags", PdfFormField.FF_MULTILINE, null); //convert field to multiline
       item.getMerged(0).put(PdfName.Q, new PdfNumber(PdfFormField.Q_CENTER)); //center form field



       Font Helvetica = FontFactory.getFont("Helvetica");
       form.setFieldProperty("Text Field 1", "textfont", "Helvetica", null);
       form.setFieldProperty("Text Field 1", "textcolor", new BaseColor(0, 93, 171), null);
       form.setFieldProperty("Text Field 1", "textsize", new Float(16), null); //change field font size to 16



       PdfDictionary widget = item.getWidget(0);
       PdfArray rect = widget.getAsArray(PdfName.RECT);
       rect.set(2, new PdfNumber(rect.getAsNumber(2).floatValue()));
       String value = "Kyle Vassella";
       form.setField("Text Field 1", value);
       stamper.setFormFlattening(true); //flatten pdf
       stamper.close();
   }
}

最佳答案

所有这些都在“iText 的实际应用”第 8 章中得到了清晰的解释。 https://developers.itextpdf.com/examples/itext-action-second-edition/chapter-8

解决此问题的一种方法是使用各个表单对象本身,而不是整个表单。

PushbuttonField button = new PushbuttonField(writer, rect, "Buttons");
button.setBackgroundColor(new GrayColor(0.75f));
button.setBorderColor(GrayColor.GRAYBLACK);
button.setBorderWidth(1);
button.setBorderStyle(PdfBorderDictionary.STYLE_BEVELED);
button.setTextColor(GrayColor.GRAYBLACK);
button.setFontSize(12);

同时查看 iText5 的 API,以便您清楚地了解每个方法的参数是什么。

http://itextsupport.com/apidocs/iText5/5.5.11/

关于java - 如何在 iText 5 中设置字体系列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48910894/

相关文章:

java - 使用带引号的多行字符串解析 CSV

java - 保留端口号专供我们的应用程序使用

Java - 如何将 PDF 打印到特定打印机?

iphone - 如何将 UIView 导出为 PDF 文件

flutter - 检测 pdfviewer 内的触摸。当小部件处理自己的触摸事件时强制检测触摸

html - 网络字体仅适用于 Mac 的 Chrome 和 Safari,

css - 字体加载不正确

大型项目的 Java 依赖管理

java - 为什么我可以从 JSP 标记文件内部输出属性,但不能从调用该标记文件的 JSP 页面输出属性?

android - 支持库中的字体 26.0.0-beta2 : Error: Content is not allowed in prolog