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

Tilman Hausherr edited comment on PDFBOX-5173 at 4/21/21, 4:11 PM:
-------------------------------------------------------------------

That's because your name tree isn't properly sorted, something goes wrong 
there. The easiest is to have a HashMap do it for you, here's the modified code 
(only beginning and end are modified)
{code}
        PDEmbeddedFilesNameTreeNode efTree = new PDEmbeddedFilesNameTreeNode();
        
        Map<String, PDComplexFileSpecification> map = new HashMap<>();

        // 创建表格属性
        COSDictionary collectionDic = new COSDictionary();
        COSDictionary schemaDict = new COSDictionary();
        schemaDict.setItem(COSName.TYPE, COSName.COLLECTION_SCHEMA);
        COSDictionary sortDic = new COSDictionary();
        sortDic.setItem(COSName.TYPE, COSName.COLLECTION_SORT);
        sortDic.setString(COSName.A, "true"); // sort ascending
        sortDic.setItem(COSName.S, COSName.getPDFName("序号")); // "it identifies 
a field described in the parent collection dictionary"
        collectionDic.setItem(COSName.TYPE, COSName.COLLECTION);
        collectionDic.setItem(COSName.SCHEMA, schemaDict);
        collectionDic.setItem(COSName.SORT, sortDic);
        collectionDic.setItem(COSName.VIEW, COSName.D); // Details mode
        COSDictionary fieldDict1 = new COSDictionary();
        fieldDict1.setItem(COSName.TYPE, COSName.COLLECTION_FIELD);
        fieldDict1.setItem(COSName.SUBTYPE, COSName.N); // type: number类型 field
        fieldDict1.setString(COSName.N, "序号"); // header text
        fieldDict1.setInt(COSName.O, 1); // order on the screen
        COSDictionary fieldDict2 = new COSDictionary();
        fieldDict2.setItem(COSName.TYPE, COSName.COLLECTION_FIELD);
        fieldDict2.setItem(COSName.SUBTYPE, COSName.S); // type: text field
        fieldDict2.setString(COSName.N, "文件类型");
        fieldDict2.setInt(COSName.O, 2);
        COSDictionary fieldDict3 = new COSDictionary();
        fieldDict3.setItem(COSName.TYPE, COSName.COLLECTION_FIELD);
        fieldDict3.setItem(COSName.SUBTYPE, COSName.S); // type: String field
        fieldDict3.setString(COSName.N, "文件名称");
        fieldDict3.setInt(COSName.O, 3);
        schemaDict.setItem("序号", fieldDict1); // field name (this is a key)
        schemaDict.setItem("文件类型", fieldDict2);
        schemaDict.setItem("文件名称", fieldDict3);
        doc.getDocumentCatalog().getCOSObject().setItem(COSName.COLLECTION, 
collectionDic);
        doc.getDocumentCatalog().setVersion("1.7");

        List<PDEmbeddedFilesNameTreeNode> kids = new 
ArrayList<PDEmbeddedFilesNameTreeNode>();
        int count = 0;
        for (String childFile : childFiles) {
            count++;
            PDComplexFileSpecification fs = new PDComplexFileSpecification();
            File attachment = new File(childFile);
            PDEmbeddedFile ef = new PDEmbeddedFile(doc, new 
FileInputStream(attachment));

            COSDictionary ciDict1 = new COSDictionary();
            ciDict1.setItem(COSName.TYPE, COSName.COLLECTION_ITEM);
            // use the field names from earlier
            ciDict1.setInt("序号", count);
            ciDict1.setString("文件类型", "filetype");
            ciDict1.setString("文件名称",attachment.getName() );
            fs.getCOSObject().setItem(COSName.CI, ciDict1);

            fs.setFileDescription(attachment.getName().replace(".pdf","")); 
//文件描述
            fs.setFileUnicode(attachment.getName()); //文件名

            ef.setSubtype("application/pdf");  //参考mime文件类型
            ef.setSize((int) attachment.length());
            Calendar c=Calendar.getInstance();
            c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
            ef.setCreationDate(c);
            ef.setModDate(c);
            fs.setEmbeddedFile(ef);
            map.put(attachment.getName(), fs);
//            PDEmbeddedFilesNameTreeNode treeNode = new 
PDEmbeddedFilesNameTreeNode();
//            treeNode.setNames(Collections.singletonMap(attachment.getName(), 
fs));
//            kids.add(treeNode);
        }
        
        PDEmbeddedFilesNameTreeNode treeNode = new 
PDEmbeddedFilesNameTreeNode();
        treeNode.setNames(map);
        kids.add(treeNode);

        efTree.setKids(kids);
{code}


was (Author: tilman):
That's because your name tree isn't properly sorted, something goes wrong 
there. The easiest is to have a TreeMap do it for you, here's the modified code 
(only beginning and end are modified)
{code}
        PDEmbeddedFilesNameTreeNode efTree = new PDEmbeddedFilesNameTreeNode();
        
        Map<String, PDComplexFileSpecification> map = new TreeMap<>();

        // 创建表格属性
        COSDictionary collectionDic = new COSDictionary();
        COSDictionary schemaDict = new COSDictionary();
        schemaDict.setItem(COSName.TYPE, COSName.COLLECTION_SCHEMA);
        COSDictionary sortDic = new COSDictionary();
        sortDic.setItem(COSName.TYPE, COSName.COLLECTION_SORT);
        sortDic.setString(COSName.A, "true"); // sort ascending
        sortDic.setItem(COSName.S, COSName.getPDFName("序号")); // "it identifies 
a field described in the parent collection dictionary"
        collectionDic.setItem(COSName.TYPE, COSName.COLLECTION);
        collectionDic.setItem(COSName.SCHEMA, schemaDict);
        collectionDic.setItem(COSName.SORT, sortDic);
        collectionDic.setItem(COSName.VIEW, COSName.D); // Details mode
        COSDictionary fieldDict1 = new COSDictionary();
        fieldDict1.setItem(COSName.TYPE, COSName.COLLECTION_FIELD);
        fieldDict1.setItem(COSName.SUBTYPE, COSName.N); // type: number类型 field
        fieldDict1.setString(COSName.N, "序号"); // header text
        fieldDict1.setInt(COSName.O, 1); // order on the screen
        COSDictionary fieldDict2 = new COSDictionary();
        fieldDict2.setItem(COSName.TYPE, COSName.COLLECTION_FIELD);
        fieldDict2.setItem(COSName.SUBTYPE, COSName.S); // type: text field
        fieldDict2.setString(COSName.N, "文件类型");
        fieldDict2.setInt(COSName.O, 2);
        COSDictionary fieldDict3 = new COSDictionary();
        fieldDict3.setItem(COSName.TYPE, COSName.COLLECTION_FIELD);
        fieldDict3.setItem(COSName.SUBTYPE, COSName.S); // type: String field
        fieldDict3.setString(COSName.N, "文件名称");
        fieldDict3.setInt(COSName.O, 3);
        schemaDict.setItem("序号", fieldDict1); // field name (this is a key)
        schemaDict.setItem("文件类型", fieldDict2);
        schemaDict.setItem("文件名称", fieldDict3);
        doc.getDocumentCatalog().getCOSObject().setItem(COSName.COLLECTION, 
collectionDic);
        doc.getDocumentCatalog().setVersion("1.7");

        List<PDEmbeddedFilesNameTreeNode> kids = new 
ArrayList<PDEmbeddedFilesNameTreeNode>();
        int count = 0;
        for (String childFile : childFiles) {
            count++;
            PDComplexFileSpecification fs = new PDComplexFileSpecification();
            File attachment = new File(childFile);
            PDEmbeddedFile ef = new PDEmbeddedFile(doc, new 
FileInputStream(attachment));

            COSDictionary ciDict1 = new COSDictionary();
            ciDict1.setItem(COSName.TYPE, COSName.COLLECTION_ITEM);
            // use the field names from earlier
            ciDict1.setInt("序号", count);
            ciDict1.setString("文件类型", "filetype");
            ciDict1.setString("文件名称",attachment.getName() );
            fs.getCOSObject().setItem(COSName.CI, ciDict1);

            fs.setFileDescription(attachment.getName().replace(".pdf","")); 
//文件描述
            fs.setFileUnicode(attachment.getName()); //文件名

            ef.setSubtype("application/pdf");  //参考mime文件类型
            ef.setSize((int) attachment.length());
            Calendar c=Calendar.getInstance();
            c.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
            ef.setCreationDate(c);
            ef.setModDate(c);
            fs.setEmbeddedFile(ef);
            map.put(attachment.getName(), fs);
//            PDEmbeddedFilesNameTreeNode treeNode = new 
PDEmbeddedFilesNameTreeNode();
//            treeNode.setNames(Collections.singletonMap(attachment.getName(), 
fs));
//            kids.add(treeNode);
        }
        
        PDEmbeddedFilesNameTreeNode treeNode = new 
PDEmbeddedFilesNameTreeNode();
        treeNode.setNames(map);
        kids.add(treeNode);

        efTree.setKids(kids);
{code}

> After Create portable collection PDF package and opening it with Acrobat 
> Reader DC, some PDFs in the package will be blank pages after clicking open
> ----------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: PDFBOX-5173
>                 URL: https://issues.apache.org/jira/browse/PDFBOX-5173
>             Project: PDFBox
>          Issue Type: Improvement
>          Components: Documentation
>         Environment: Java 1.8  pdfbox 2.0.24-snapshot
>            Reporter: tanqichao
>            Priority: Major
>         Attachments: SortAttachments.java, create_reslut.pdf, 
> image-2021-04-21-17-44-21-334.png, image-2021-04-21-17-44-46-925.png, 
> 卷内目录.pdf, 备考表.pdf, 封面.pdf, 深高顾api.pdf
>
>
>  
> !image-2021-04-21-17-44-46-925.png!
>  
> !image-2021-04-21-17-44-21-334.png!



--
This message was sent by Atlassian Jira
(v8.3.4#803005)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to