Hi,

Thank you for reporting this, you're right, the behavior contradicts the javadoc. I looked at the history and it was introduced in 2020 in PDFBOX-4954. The previous implementation used COSArrayList.converterToCOSArray() which would return an empty COSArray. But even that isn't correct, with null the thread item should just be removed. I'll create an issue. In the meantime pass an empty list, or call documentCatalog.getCOSObject().removeItem(COSName.THREADS);
Tilman

Am 03.04.2026 um 19:56 schrieb Predrag Stojkovi� via users:
Hello all,

In new release of Apache PDFBox 3.0.7 there is a problem with 
PDDocumentCatalog.setThreads(null).

This worked fine with version 3.0.1 (or at least I think so), but with new 
version it will cause an exception:

java.lang.IllegalArgumentException: List of COSObjectables cannot be null
   at org.apache.pdfbox.cos.COSArray.<init>(COSArray.java:56)
   at 
org.apache.pdfbox.pdmodel.PDDocumentCatalog.setThreads(PDDocumentCatalog.java:241)
   at com.ct.ecm.pdf.PDFCompress.compressPDFbyRemovingInfo(PDFCompress.java:156)

When you look at source code of PDDocumentCatalog, it shows that parameter 
threads can be null:

/**
* Sets the list of threads for this pdf document.
*
* @param threads The list of threads, or null to clear it.
*/
public void setThreads(List<PDThread> threads)
{
     COSArray threadsArray = new COSArray(threads);
     threadsArray.setDirect(false);
     root.setItem(COSName.THREADS, threadsArray);
}

So, it is supposed to accept null as value for threads parameter.
However, the constructor of COSArray class is testing if this argument is null, 
and throws an exception:

/**
* Use the given list to initialize the COSArray.
*
* @param cosObjectables the initial list of COSObjectables
*/
public COSArray(List<? extends COSObjectable> cosObjectables)
{
     if (cosObjectables == null)
     {
         throw new IllegalArgumentException("List of COSObjectables cannot be 
null");
     }
     updateState = new COSUpdateState(this);
     setDirect(true);
     cosObjectables.forEach(cosObjectable ->
         objects.add(cosObjectable != null ? cosObjectable.getCOSObject() : 
null));
}

Please fix this in new version, and for now please tell me the alternative way 
to clear threads in PDDocumentCatalog.


Thank you and best regards,

Predrag

Reply via email to