itextpdf通过for导出多个pdf出现com.itextpdf.kernel.PdfException: pdf.inderect.object.belong.to.other.pdf.docu

pom导入依赖包

<span style="white-space:pre">	</span><!-- 导出pdf依赖的jar -->
		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>barcodes</artifactId>
			<version>7.0.0</version>
			<!-- barcodes depends on kernel -->
		</dependency>


		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>font-asian</artifactId>
			<version>7.0.0</version>
		</dependency>


		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>forms</artifactId>
			<version>7.0.0</version>
			<!-- forms depends on kernel and layout -->
		</dependency>


		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>hyph</artifactId>
			<version>7.0.0</version>
		</dependency>


		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>io</artifactId>
			<version>7.0.0</version>
		</dependency>


		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>kernel</artifactId>
			<version>7.0.0</version>
			<!-- kernel depends on io -->
		</dependency>


		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>layout</artifactId>
			<version>7.0.0</version>
			<!-- layout depends on kernel -->
		</dependency>


		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>pdfa</artifactId>
			<version>7.0.0</version>
			<!-- pdfa depends on kernel -->
		</dependency>


		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>sign</artifactId>
			<version>7.0.0</version>
			<!-- sign depends on kernel, layout and forms -->
		</dependency>

import java.io.IOException;

import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.element.Text;
import com.itextpdf.layout.property.TextAlignment;
 
/**
 * Simple List example.
 */
public class Demo {
        public static final String DEST = "C:/aa/test/";
        public static PdfFont cnFont = null;
        
    public static void main(String args[]) throws IOException {
        new Demo().createPdf(DEST);
    }
 
    public void createPdf(String dest) throws IOException {
    	for(int j =0 ;j<2;j++){
    		PdfWriter writer = new PdfWriter(dest + j + ".pdf");
    		PdfDocument pdf = new PdfDocument(writer);
    		
    		Document document = new Document(pdf);
    		document.add(createYxTitle("(aaaa)"));
    		document.add(createParagraph("协议编号:___aaa___",10).setTextAlignment(TextAlignment.RIGHT));
    		
    		Paragraph p1 = new Paragraph();
    		p1.setFont(getCnFont());
    		p1.setBold();
    		p1.setFontSize(12);
    		p1.add(new Text("甲方:小明 \n"));
    		p1.add(new Text("真实姓名:小明 \n"));
    		document.add(p1);
    		
    		Paragraph p = new Paragraph();
    		p.setFont(getCnFont());
    		p.setBold();
    		p.setFontSize(12);
    		Text t1 = new Text("乙方:夏红 \n");
    		Text t2 = new Text("地址:bj\n");
    		
    		p.add(t1);
    		p.add(t2);
    		document.add(p);
    		
    		document.close();
    		document.flush();
    	}
    }
    
    private Paragraph createParagraph(String text,int size){
    	Paragraph p = new Paragraph(text);
    	p.setFontSize(size);
    	p.setFont(getCnFont());
    	return p;
    }
    
    private Paragraph createYxTitle(String text){
    	 Paragraph p = new Paragraph();
         Text title = new Text("helloworld");
         title.setBold();
         Text term = new Text(text);
         term.setFontSize(12);
         p.add(title).add(term);
         p.setFont(getCnFont());
         p.setTextAlignment(TextAlignment.CENTER);
         return p;
    }
    
    /**
     * 
     * @Description: 获取支持中文的字体,为单例
     * @param @return   
     * @return PdfFont  
     * @throws
     * @author peng.wu
     * @date 2016年8月24日
     */
    private PdfFont getCnFont(){
		try {
			if(cnFont == null){
				cnFont = PdfFontFactory.createFont("STSong-Light", "UniGB-UCS2-H", false);
			}
		} catch (IOException e) {
			e.printStackTrace();
		}
    	return cnFont;
    }
}

运行上述程序出现如下异常


SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Exception in thread "main" com.itextpdf.kernel.PdfException: pdf.inderect.object.belong.to.other.pdf.document.Copy.object.to.current.pdf.document
	at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:184)
	at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:174)
	at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:104)
	at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:176)
	at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:104)
	at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:176)
	at com.itextpdf.kernel.pdf.PdfOutputStream.write(PdfOutputStream.java:104)
	at com.itextpdf.kernel.pdf.PdfWriter.writeToBody(PdfWriter.java:315)
	at com.itextpdf.kernel.pdf.PdfWriter.flushObject(PdfWriter.java:232)
	at com.itextpdf.kernel.pdf.PdfDocument.flushObject(PdfDocument.java:1257)
	at com.itextpdf.kernel.pdf.PdfObject.flush(PdfObject.java:147)
	at com.itextpdf.kernel.pdf.PdfObject.flush(PdfObject.java:124)
	at com.itextpdf.kernel.pdf.PdfObjectWrapper.flush(PdfObjectWrapper.java:97)
	at com.itextpdf.kernel.pdf.PdfPage.flush(PdfPage.java:410)
	at com.itextpdf.kernel.pdf.PdfPage.flush(PdfPage.java:367)
	at com.itextpdf.kernel.pdf.PdfDocument.close(PdfDocument.java:720)
	at com.itextpdf.layout.Document.close(Document.java:115)
	at com.sirding.pdf.Demo.createPdf(Demo.java:58)
	at com.sirding.pdf.Demo.main(Demo.java:27)


问题出现的原因在执行

document.close();
关流操作,下面是源码中的逻辑判断,红色是出现异常的位置

 private void write(PdfIndirectReference indirectReference) {
        <span style="color:#ff0000;">if (document != null && !indirectReference.getDocument().equals(document)) {
            throw new PdfException(PdfException.PdfInderectObjectBelongToOtherPdfDocument);
        }</span>
        if (indirectReference.getRefersTo() == null) {
            write(PdfNull.PDF_NULL);
        } else if (indirectReference.getGenNumber() == 0) {
            writeInteger(indirectReference.getObjNumber()).
                    writeBytes(endIndirectWithZeroGenNr);
        } else {
            writeInteger(indirectReference.getObjNumber()).
                    writeSpace().
                    writeInteger(indirectReference.getGenNumber()).
                    writeBytes(endIndirect);
        }
    }

!indirectReference.getDocument().equals(document)此部分是出现问题的具体位置,大致意思就是说当前使<span style="font-family: Arial, Helvetica, sans-serif;">document与对象内部关联应用的对象不一致,查看demo发现定义了</span>
<span style="font-family: Arial, Helvetica, sans-serif;"></span><pre name="code" class="java"> public static PdfFont cnFont = null;

 这样的静态成员变量,也就是第二关流或是flush时使用的document和内部关联的document不是同一个对象的应用,因此出现上述异常。 

解决办法:

 public static PdfFont cnFont = null;
改为局部变量即可。




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值