[ 
https://issues.apache.org/jira/browse/PDFBOX-5720?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17790398#comment-17790398
 ] 

Michael Bädorf commented on PDFBOX-5720:
----------------------------------------

I tried to create a unit test that is really similar to my implemented code.

{code:java}
import org.apache.pdfbox.Loader;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.interactive.form.PDCheckBox;
import org.apache.pdfbox.pdmodel.interactive.form.PDField;
import org.junit.jupiter.api.Test;

import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;

import static java.nio.file.Files.newInputStream;
import static java.nio.file.Paths.get;
import static java.util.Objects.nonNull;
import static org.junit.jupiter.api.Assertions.assertTrue;

public class PDCheckboxTest {

    @Test
    void isChecked_EarlyAutoClose_WrongCheckedState() throws Exception {
        // arrange
        byte[] data;
        try (InputStream is = 
newInputStream(get("src/test/resources/ticket.pdf"))) {
            assert nonNull(is);
            data = is.readAllBytes();
        }

        List<PDField> fields = new ArrayList<>();
        try (PDDocument document = Loader.loadPDF(data)) {
            
fields.addAll(document.getDocumentCatalog().getAcroForm().getFields());
        }

        // act
        List<PDCheckBox> actual = filterCheckedCheckboxes(fields);

        // assert
        Optional<PDCheckBox> checkBox = actual.stream()
            .filter(checkbox -> "A".equals(checkbox.getPartialName()))
            .findFirst();

        assertTrue(checkBox.isEmpty());
    }


    @Test
    void isChecked_LateAutoClose_CorrectCheckedState() throws Exception {
        // arrange
        byte[] data;
        try (InputStream is = 
newInputStream(get("src/test/resources/ticket.pdf"))) {
            assert nonNull(is);
            data = is.readAllBytes();
        }

        List<PDField> fields = new ArrayList<>();
        try (PDDocument document = Loader.loadPDF(data)) {
            
fields.addAll(document.getDocumentCatalog().getAcroForm().getFields());

            // act
            List<PDCheckBox> actual = filterCheckedCheckboxes(fields);

            // assert
            Optional<PDCheckBox> checkBox = actual.stream()
                .filter(checkbox -> "A".equals(checkbox.getPartialName()))
                .findFirst();

            assertTrue(checkBox.isPresent());
        } catch (Exception e) {
            throw e;
        }


    }

    <T extends PDField> List<T> filterByType(List<PDField> fields, Class<T> 
clz) {
        return fields.stream()
            .filter(clz::isInstance)
            .map(clz::cast)
            .toList();
    }

    List<PDCheckBox> filterCheckedCheckboxes(List<PDField> fields) {
        return filterByType(fields, PDCheckBox.class)
            .stream()
            .filter(PDCheckBox::isChecked)
            .toList();
    }
}

{code}

Result:
Leave the try block open til the end of all steps, the behavior is as expected.
Unfortunatley I havn't found this information in the migration guide. I'm not 
sure if this should also mentioned there.
Ticket can be closed.

> Checked state of PDCheckbox
> ---------------------------
>
>                 Key: PDFBOX-5720
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-5720
>             Project: PDFBox
>          Issue Type: Bug
>          Components: AcroForm
>    Affects Versions: 3.0.0 PDFBox
>            Reporter: Michael Bädorf
>            Priority: Major
>         Attachments: ticket.pdf
>
>
> Before v3.0.0 is was possible to get the selected state simply by using the 
> isChecked() function. After updating to v.3.0.0 the function always returns 
> false with the same input PDF that works well til v2.0.30.
> There are no migration advices so I think this is a bug.
> This is the code I use for filtering selected checkboxes. but now always 
> returns an empty list (in contrast to v2.0.30)
> {{{color:#000080}private {color}List<PDField> 
> filterCheckedCheckboxes(List<PDField> fields) {}}
> {{  {color:#000080}return {color}filterByType(fields, 
> PDCheckBox.{color:#000080}class{color})}}
> {{   .stream()}}
> {{   .filter(PDCheckBox::isChecked)}}
> {{   .map(PDField.{color:#000080}class{color}::cast)}}
> {{   .toList();}}
> }
>  
> I can also find no test for PDCheckBox.isChecked()



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@pdfbox.apache.org
For additional commands, e-mail: dev-h...@pdfbox.apache.org

Reply via email to