Itext7 是否可以使用带有十字而不是子弹的单选按钮?-iText 7.1.0 for Java
有没有人知道,是否可以用一个十字(类似复选框)来代替通常的子弹?什么也没找到。谢谢!德克 为了产生这个结果,我采用了一个iText样本Itext7 是否可以使用带有十字而不是子弹的单选按钮?-iText 7.1.0 for Java,itext7,Itext7,有没有人知道,是否可以用一个十字(类似复选框)来代替通常的子弹?什么也没找到。谢谢!德克 为了产生这个结果,我采用了一个iText样本 package jumpstart; import com.itextpdf.forms.PdfAcroForm; import com.itextpdf.forms.fields.PdfButtonFormField; import com.itextpdf.forms.fields.PdfFormField; import com.itextpdf.la
package jumpstart;
import com.itextpdf.forms.PdfAcroForm;
import com.itextpdf.forms.fields.PdfButtonFormField;
import com.itextpdf.forms.fields.PdfFormField;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.property.TextAlignment;
import java.awt.Desktop;
import java.io.File;
public class Problem8 {
public static void main(String[] args) throws Exception {
PdfWriter writer = new PdfWriter("problem8.pdf");
PdfDocument pdf = new PdfDocument(writer);
Document doc = new Document(pdf);
PdfFont font = PdfFontFactory.createFont("src/main/resources/fonts/arialuni.ttf", PdfEncodings.IDENTITY_H, true);
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
String[] languages = { "Dutch", "English", "French" };
Rectangle rect;
Paragraph para;
PdfButtonFormField radioGroup = PdfFormField.createRadioGroup(pdf, "Language", "");
pdf.addNewPage();
for (int i = 1; i <= languages.length; i++) {
rect = new Rectangle(40, 800 - i * 30, 20, 20);
para = new Paragraph(languages[i - 1]);
para.setFont(font);
para.setFontSize(18);
PdfFormField.createRadioButton(pdf, rect, radioGroup, languages[i - 1]);
doc.showTextAligned(para, 70, 800 - i * 30, TextAlignment.LEFT);
}
form.addField(radioGroup);
doc.close();
Desktop.getDesktop().open(new File("problem8.pdf"));
}
}
包跳线启动;
导入com.itextpdf.forms.PdfAcroForm;
导入com.itextpdf.forms.fields.PdfButtonFormField;
导入com.itextpdf.forms.fields.PdfFormField;
导入com.itextpdf.layout.Document;
导入com.itextpdf.layout.element.paragration;
导入com.itextpdf.io.font.PdfEncodings;
导入com.itextpdf.kernel.font.PdfFont;
导入com.itextpdf.kernel.font.PdfFontFactory;
导入com.itextpdf.kernel.geom.Rectangle;
导入com.itextpdf.kernel.pdf.PdfDocument;
导入com.itextpdf.kernel.pdf.PdfWriter;
导入com.itextpdf.layout.property.TextAlignment;
导入java.awt.Desktop;
导入java.io.File;
公共课问题8{
公共静态void main(字符串[]args)引发异常{
PdfWriter writer=新的PdfWriter(“problem8.pdf”);
PdfDocument pdf=新PdfDocument(编写器);
文件文件=新文件(pdf);
PdfFont font=PdfFontFactory.createFont(“src/main/resources/fonts/arialuni.ttf”,PdfEncodings.IDENTITY_H,true);
PdfAcroForm form=PdfAcroForm.getAcroForm(pdf,true);
字符串[]语言={“荷兰语”、“英语”、“法语”};
矩形矩形;
第6段;
PdfButtonFormField-radioGroup=PdfFormField.createRadioGroup(pdf,“语言”,”);
pdf.addNewPage();
对于(inti=1;i,这是完全可能的。这显然是常见问题之一
如果要替换外观,则必须替换绘制矩形和十字的流。在IText 7中,我们添加了一些常用的外观,以便在创建以下元素时轻松使用它们:
其中checkType可以是:TYPE\u CHECK、TYPE\u CIRCLE、TYPE\u CROSS、TYPE\u DIAMOND、TYPE\u SQUARE、TYPE\u STAR。也可以使用以下命令更改现有元素的外观:
由于Joris链接的示例不会立即应用于单选按钮(看起来它们的on外观默认硬编码为圆形),因此我编写了一个简单的示例,演示如何在创建button对象bu之后,在将整个单选组添加到表单字段之前覆盖该外观:
public void createPdf(String dest) throws IOException, java.io.IOException{
float width = 20;
float height = 20;
List<PdfFormField> radiobuttons = new ArrayList<>();
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
Document doc = new Document(pdf);
//PdfFont font = PdfFontFactory.createFont("src/main/resources/fonts/arialuni.ttf", PdfEncodings.IDENTITY_H, true);
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
String[] languages = { "Dutch", "English", "French" };
Rectangle rect;
Paragraph para;
PdfButtonFormField radioGroup = PdfFormField.createRadioGroup(pdf, "Language", "");
pdf.addNewPage();
for (int i = 1; i <= languages.length; i++) {
rect = new Rectangle(40, 800 - i * 30, width, height);
para = new Paragraph(languages[i - 1]);
//para.setFont(font);
para.setFontSize(18);
PdfFormField radioButton = PdfFormField.createRadioButton(pdf, rect, radioGroup, languages[i - 1]);
createAndSetCircleGraphicForOn(radioButton,pdf,width,height, languages[i-1]);
radiobuttons.add(radioButton);
doc.showTextAligned(para, 70, 800 - i * 30, TextAlignment.LEFT);
}
form.addField(radioGroup);
doc.close();
}
private static void createAndSetCircleGraphicForOn(PdfFormField radiobutton, PdfDocument pdfDoc, float width, float height, String value){
PdfStream streamOn = (PdfStream) new PdfStream().makeIndirect(pdfDoc);
PdfCanvas canvasOn = new PdfCanvas(streamOn, new PdfResources(), pdfDoc);
Rectangle rect = new Rectangle(0, 0, width, height);
PdfFormXObject xObjectOn = new PdfFormXObject(rect);
drawRadioFieldOnWithCross(canvasOn, ColorConstants.BLACK,1f, width, height, true);
PdfStream streamOff = (PdfStream) new PdfStream().makeIndirect(pdfDoc);
PdfWidgetAnnotation widget = radiobutton.getWidgets().get(0);
xObjectOn.getPdfObject().getOutputStream().writeBytes(streamOn.getBytes());
widget.setNormalAppearance(new PdfDictionary());
widget.getNormalAppearanceObject().put(new PdfName(value), xObjectOn.getPdfObject());
}
private static void drawRadioFieldOnWithCross(PdfCanvas canvas,Color strokeColor, float strokeWidth, float width, float height, boolean on) {
canvas.saveState();
if (on) {
canvas.
setStrokeColor(strokeColor)
.setLineWidth(strokeWidth)
//bottom left to top right
.moveTo(0,0)
.lineTo(width,height)
.stroke()
//Top left to bottom right
.moveTo(0,height)
.lineTo(width,0)
.stroke();
}
canvas.restoreState();
}
public void createPdf(String dest)抛出IOException,java.io.IOException{
浮动宽度=20;
浮子高度=20;
列表单选按钮=新建ArrayList();
PdfWriter writer=新的PdfWriter(dest);
PdfDocument pdf=新PdfDocument(编写器);
文件文件=新文件(pdf);
//PdfFont font=PdfFontFactory.createFont(“src/main/resources/fonts/arialuni.ttf”,PdfEncodings.IDENTITY_H,true);
PdfAcroForm form=PdfAcroForm.getAcroForm(pdf,true);
字符串[]语言={“荷兰语”、“英语”、“法语”};
矩形矩形;
第6段;
PdfButtonFormField-radioGroup=PdfFormField.createRadioGroup(pdf,“语言”,”);
pdf.addNewPage();
对于(int i=1;i不可能完全更改单选按钮的项目符号。
只有在与单选按钮组交互时,Samuel Huylebroeck的解决方案才有效:
单击“Dutch”后,看起来是这样的:
但在离开单选按钮组后,例如,通过单击页面的另一部分,它看起来如下所示:
这是无法更改的单选按钮的标准外观。很遗憾,知道为什么会这样会很有趣。
令人困惑的是,打印预览再次显示十字:
我阅读了常见问题解答。但在我的示例中,没有复选框,只有一组单选按钮,没有复选类型。然后这是一个新文档,代码不会对现有文档进行操作。我是iText开发新手,发现很难获得正确的信息。你能给出一些代码行,将项目符号改为十字吗对于RADIOBUTTON。或者是否有其他常见问题解答可以完成此任务。感谢您的帮助!我不知道这样的事情是可能的!我尝试过,它适用于其中一个项目,单击按钮时的项目。当离开按钮时,有第二个项目的项目略大一些。我尝试使用您的伟大解决方案自行替换它n在此发布。非常感谢您的帮助!未找到解决问题的方法。“外观词典指定在与用户交互期间如何在页面上直观地显示注释”表示您离开radioGroup时(单击页面的空白部分)没有任何交互,显示了一个标准项目符号。可能无法更改此项目符号,因为它是由pdf阅读器本身绘制的。嗯,更可能的是我没有替换足够的外观流,我将再次查看输出。这是pdf查看器的问题。关闭“突出显示现有字段”
setCheckType(int checkType).
public void createPdf(String dest) throws IOException, java.io.IOException{
float width = 20;
float height = 20;
List<PdfFormField> radiobuttons = new ArrayList<>();
PdfWriter writer = new PdfWriter(dest);
PdfDocument pdf = new PdfDocument(writer);
Document doc = new Document(pdf);
//PdfFont font = PdfFontFactory.createFont("src/main/resources/fonts/arialuni.ttf", PdfEncodings.IDENTITY_H, true);
PdfAcroForm form = PdfAcroForm.getAcroForm(pdf, true);
String[] languages = { "Dutch", "English", "French" };
Rectangle rect;
Paragraph para;
PdfButtonFormField radioGroup = PdfFormField.createRadioGroup(pdf, "Language", "");
pdf.addNewPage();
for (int i = 1; i <= languages.length; i++) {
rect = new Rectangle(40, 800 - i * 30, width, height);
para = new Paragraph(languages[i - 1]);
//para.setFont(font);
para.setFontSize(18);
PdfFormField radioButton = PdfFormField.createRadioButton(pdf, rect, radioGroup, languages[i - 1]);
createAndSetCircleGraphicForOn(radioButton,pdf,width,height, languages[i-1]);
radiobuttons.add(radioButton);
doc.showTextAligned(para, 70, 800 - i * 30, TextAlignment.LEFT);
}
form.addField(radioGroup);
doc.close();
}
private static void createAndSetCircleGraphicForOn(PdfFormField radiobutton, PdfDocument pdfDoc, float width, float height, String value){
PdfStream streamOn = (PdfStream) new PdfStream().makeIndirect(pdfDoc);
PdfCanvas canvasOn = new PdfCanvas(streamOn, new PdfResources(), pdfDoc);
Rectangle rect = new Rectangle(0, 0, width, height);
PdfFormXObject xObjectOn = new PdfFormXObject(rect);
drawRadioFieldOnWithCross(canvasOn, ColorConstants.BLACK,1f, width, height, true);
PdfStream streamOff = (PdfStream) new PdfStream().makeIndirect(pdfDoc);
PdfWidgetAnnotation widget = radiobutton.getWidgets().get(0);
xObjectOn.getPdfObject().getOutputStream().writeBytes(streamOn.getBytes());
widget.setNormalAppearance(new PdfDictionary());
widget.getNormalAppearanceObject().put(new PdfName(value), xObjectOn.getPdfObject());
}
private static void drawRadioFieldOnWithCross(PdfCanvas canvas,Color strokeColor, float strokeWidth, float width, float height, boolean on) {
canvas.saveState();
if (on) {
canvas.
setStrokeColor(strokeColor)
.setLineWidth(strokeWidth)
//bottom left to top right
.moveTo(0,0)
.lineTo(width,height)
.stroke()
//Top left to bottom right
.moveTo(0,height)
.lineTo(width,0)
.stroke();
}
canvas.restoreState();
}