📄 pdfmergerutility.java
字号:
}
else
{
destThreads.addAll( srcThreads );
}
COSName names = COSName.getPDFName( "Names" );
PDDocumentNameDictionary destNames = destCatalog.getNames();
PDDocumentNameDictionary srcNames = srcCatalog.getNames();
if( srcNames != null )
{
if( destNames == null )
{
destCatalog.getCOSDictionary().setItem( names, cloneForNewDocument( destination, srcNames ) );
}
else
{
//warning, potential for collision here!!
destNames.getCOSDictionary().mergeInto( (COSDictionary)cloneForNewDocument( destination, srcNames ) );
}
}
PDDocumentOutline destOutline = destCatalog.getDocumentOutline();
PDDocumentOutline srcOutline = srcCatalog.getDocumentOutline();
if( srcOutline != null )
{
if( destOutline == null )
{
PDDocumentOutline cloned =
new PDDocumentOutline( (COSDictionary)cloneForNewDocument( destination, srcOutline ) );
destCatalog.setDocumentOutline( cloned );
}
else
{
PDOutlineItem first = srcOutline.getFirstChild();
PDOutlineItem clonedFirst = new PDOutlineItem( (COSDictionary)cloneForNewDocument(
destination, first ));
destOutline.appendChild( clonedFirst );
}
}
String destPageMode = destCatalog.getPageMode();
String srcPageMode = srcCatalog.getPageMode();
if( destPageMode == null )
{
destCatalog.setPageMode( srcPageMode );
}
COSName pageLabels = COSName.getPDFName( "PageLabels" );
COSDictionary destLabels = (COSDictionary)destCatalog.getCOSDictionary().getDictionaryObject( pageLabels );
COSDictionary srcLabels = (COSDictionary)srcCatalog.getCOSDictionary().getDictionaryObject( pageLabels );
if( srcLabels != null )
{
int destPageCount = destination.getNumberOfPages();
COSArray destNums = null;
if( destLabels == null )
{
destLabels = new COSDictionary();
destNums = new COSArray();
destLabels.setItem( COSName.getPDFName( "Nums" ), destNums );
destCatalog.getCOSDictionary().setItem( pageLabels, destLabels );
}
else
{
destNums = (COSArray)destLabels.getDictionaryObject( COSName.getPDFName( "Nums" ) );
}
COSArray srcNums = (COSArray)srcLabels.getDictionaryObject( COSName.getPDFName( "Nums" ) );
for( int i=0; i<srcNums.size(); i+=2 )
{
COSNumber labelIndex = (COSNumber)srcNums.getObject( i );
long labelIndexValue = labelIndex.intValue();
destNums.add( new COSInteger( labelIndexValue + destPageCount ) );
destNums.add( cloneForNewDocument( destination, srcNums.getObject( i+1 ) ) );
}
}
COSName metadata = COSName.getPDFName( "Metadata" );
COSStream destMetadata = (COSStream)destCatalog.getCOSDictionary().getDictionaryObject( metadata );
COSStream srcMetadata = (COSStream)srcCatalog.getCOSDictionary().getDictionaryObject( metadata );
if( destMetadata == null && srcMetadata != null )
{
PDStream newStream = new PDStream( destination, srcMetadata.getUnfilteredStream(), false );
newStream.getStream().mergeInto( srcMetadata );
newStream.addCompression();
destCatalog.getCOSDictionary().setItem( metadata, newStream );
}
//finally append the pages
List pages = source.getDocumentCatalog().getAllPages();
Iterator pageIter = pages.iterator();
while( pageIter.hasNext() )
{
PDPage page = (PDPage)pageIter.next();
PDPage newPage =
new PDPage( (COSDictionary)cloneForNewDocument( destination, page.getCOSDictionary() ) );
destination.addPage( newPage );
}
}
Map clonedVersion = new HashMap();
private COSBase cloneForNewDocument( PDDocument destination, Object base ) throws IOException
{
if( base == null )
{
return null;
}
COSBase retval = (COSBase)clonedVersion.get( base );
if( retval != null )
{
//we are done, it has already been converted.
}
else if( base instanceof List )
{
COSArray array = new COSArray();
List list = (List)base;
for( int i=0; i<list.size(); i++ )
{
array.add( cloneForNewDocument( destination, list.get( i ) ) );
}
retval = array;
}
else if( base instanceof COSObjectable && !(base instanceof COSBase) )
{
retval = cloneForNewDocument( destination, ((COSObjectable)base).getCOSObject() );
clonedVersion.put( base, retval );
}
else if( base instanceof COSObject )
{
COSObject object = (COSObject)base;
retval = cloneForNewDocument( destination, object.getObject() );
clonedVersion.put( base, retval );
}
else if( base instanceof COSArray )
{
COSArray newArray = new COSArray();
COSArray array = (COSArray)base;
for( int i=0; i<array.size(); i++ )
{
newArray.add( cloneForNewDocument( destination, array.get( i ) ) );
}
retval = newArray;
clonedVersion.put( base, retval );
}
else if( base instanceof COSStream )
{
COSStream originalStream = (COSStream)base;
List keys = originalStream.keyList();
PDStream stream = new PDStream( destination, originalStream.getFilteredStream(), true );
clonedVersion.put( base, stream.getStream() );
for( int i=0; i<keys.size(); i++ )
{
COSName key = (COSName)keys.get( i );
stream.getStream().setItem( key, cloneForNewDocument(destination,originalStream.getItem(key)));
}
retval = stream.getStream();
}
else if( base instanceof COSDictionary )
{
COSDictionary dic = (COSDictionary)base;
List keys = dic.keyList();
retval = new COSDictionary();
clonedVersion.put( base, retval );
for( int i=0; i<keys.size(); i++ )
{
COSName key = (COSName)keys.get( i );
((COSDictionary)retval).setItem( key, cloneForNewDocument(destination,dic.getItem(key)));
}
}
else
{
retval = (COSBase)base;
}
clonedVersion.put( base, retval );
return retval;
}
private int nextFieldNum = 1;
/**
* Merge the contents of the source form into the destination form
* for the destination file.
*
* @param destination the destination document
* @param destAcroForm the destination form
* @param srcAcroForm the source form
* @throws IOException If an error occurs while adding the field.
*/
private void mergeAcroForm(PDDocument destination, PDAcroForm destAcroForm, PDAcroForm srcAcroForm)
throws IOException
{
List destFields = destAcroForm.getFields();
List srcFields = srcAcroForm.getFields();
if( srcFields != null )
{
if( destFields == null )
{
destFields = new COSArrayList();
destAcroForm.setFields( destFields );
}
Iterator srcFieldsIterator = srcFields.iterator();
while (srcFieldsIterator.hasNext())
{
PDField srcField = (PDField)srcFieldsIterator.next();
PDField destField =
PDFieldFactory.createField(
destAcroForm,
(COSDictionary)cloneForNewDocument(destination, srcField.getDictionary() ));
// if the form already has a field with this name then we need to rename this field
// to prevent merge conflicts.
if ( destAcroForm.getField(destField.getFullyQualifiedName()) != null )
{
destField.setPartialName("dummyFieldName"+(nextFieldNum++));
}
destFields.add(destField);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -