Itext7 是否可以使用带有十字而不是子弹的单选按钮?-iText 7.1.0 for Java

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

有没有人知道,是否可以用一个十字(类似复选框)来代替通常的子弹?什么也没找到。谢谢!德克

为了产生这个结果,我采用了一个iText样本

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();
}