You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by le...@apache.org on 2023/07/23 14:27:50 UTC
svn commit: r1911214 - in /pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter: COSWriter.java compress/COSWriterCompressionPool.java
Author: lehmi
Date: Sun Jul 23 14:27:50 2023
New Revision: 1911214
URL: http://svn.apache.org/viewvc?rev=1911214&view=rev
Log:
PDFBOX-5518: add support for indirect COSArrays
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterCompressionPool.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java?rev=1911214&r1=1911213&r2=1911214&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/COSWriter.java Sun Jul 23 14:27:50 2023
@@ -489,13 +489,13 @@ public class COSWriter implements ICOSVi
objectKeys.put(object, key);
keyObject.put(key, object);
}
+ number = compressionPool.getHighestXRefObjectNumber();
for (COSObjectKey key : compressionPool.getTopLevelObjects())
{
currentObjectKey = key;
doWriteObject(key, keyObject.get(key));
}
// Append object streams to document.
- number = compressionPool.getHighestXRefObjectNumber();
for (COSWriterObjectStream finalizedObjectStream : compressionPool
.createObjectStreams())
{
@@ -1090,24 +1090,20 @@ public class COSWriter implements ICOSVi
}
@Override
- public void visitFromArray(COSArray obj) throws IOException
+ public void visitFromArray(COSArray array) throws IOException
{
int count = 0;
getStandardOutput().write(ARRAY_OPEN);
- for (Iterator<COSBase> i = obj.iterator(); i.hasNext();)
+ for (Iterator<COSBase> i = array.iterator(); i.hasNext();)
{
COSBase current = i.next();
if( current instanceof COSDictionary )
{
- if (current.isDirect())
- {
- visitFromDictionary((COSDictionary)current);
- }
- else
- {
- addObjectToWrite( current );
- writeReference( current );
- }
+ writeDictionary((COSDictionary) current);
+ }
+ else if (current instanceof COSArray)
+ {
+ writeArray((COSArray) current);
}
else if( current instanceof COSObject )
{
@@ -1139,6 +1135,32 @@ public class COSWriter implements ICOSVi
getStandardOutput().writeEOL();
}
+ private void writeArray(COSArray array) throws IOException
+ {
+ if (array.isDirect())
+ {
+ visitFromArray(array);
+ }
+ else
+ {
+ addObjectToWrite(array);
+ writeReference(array);
+ }
+ }
+
+ private void writeDictionary(COSDictionary dictionary) throws IOException
+ {
+ if (dictionary.isDirect())
+ {
+ visitFromDictionary(dictionary);
+ }
+ else
+ {
+ addObjectToWrite(dictionary);
+ writeReference(dictionary);
+ }
+ }
+
@Override
public void visitFromBoolean(COSBoolean obj) throws IOException
{
@@ -1177,18 +1199,7 @@ public class COSWriter implements ICOSVi
item.setDirect(true);
}
}
-
- if(dict.isDirect())
- {
- // If the object should be written direct, we need
- // to pass the dictionary to the visitor again.
- visitFromDictionary(dict);
- }
- else
- {
- addObjectToWrite( dict );
- writeReference( dict );
- }
+ writeDictionary(dict);
}
else if( value instanceof COSObject )
{
@@ -1215,7 +1226,14 @@ public class COSWriter implements ICOSVi
}
else
{
- value.accept(this);
+ if (value instanceof COSArray)
+ {
+ writeArray((COSArray) value);
+ }
+ else
+ {
+ value.accept(this);
+ }
}
}
getStandardOutput().writeEOL();
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterCompressionPool.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterCompressionPool.java?rev=1911214&r1=1911213&r2=1911214&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterCompressionPool.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdfwriter/compress/COSWriterCompressionPool.java Sun Jul 23 14:27:50 2023
@@ -153,7 +153,9 @@ public class COSWriterCompressionPool
{
COSBase base = current;
if (current instanceof COSStream
- || (current instanceof COSDictionary && !current.isDirect()))
+ || (current instanceof COSDictionary && !current.isDirect()) //
+ || (current instanceof COSArray && !current.isDirect()) //
+ )
{
base = addObjectToPool(base.getKey(), current);
}