2014-04-08 46 views
5

Bir pdf dosyasının ilk sayfasını PDFBox kullanarak resme dönüştürmeye çalışıyorum. Büyük bir pdf dosyası yüklediğimde bir istisna alıyorum.PDFbox büyük dosya yükleme

kodu:

PDDocument doc; 
    try { 
     InputStream input = new URL("http://www.jewishfederations.org/local_includes/downloads/39497.pdf").openStream(); 
     doc = PDDocument.load(input); 
     PDPage firstPage = (PDPage) doc.getDocumentCatalog().getAllPages().get(0); 
     BufferedImage image =firstPage.convertToImage(); 
     File outputfile = new File("image2.png"); 
     ImageIO.write(image, "png", outputfile); 
     input.close(); 
     doc.close(); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

istisna:

org.apache.pdfbox.pdfparser.BaseParser parseCOSStream 
WARNING: Specified stream length 72435 is wrong. Fall back to reading stream until 'endstream'. 
org.apache.pdfbox.exceptions.WrappedIOException: Could not push back 72435 bytes in order to reparse stream. Try increasing push back buffer using system property org.apache.pdfbox.baseParser.pushBackSize 
    at org.apache.pdfbox.pdfparser.BaseParser.parseCOSStream(BaseParser.java:554) 
    at org.apache.pdfbox.pdfparser.PDFParser.parseObject(PDFParser.java:605) 
    at org.apache.pdfbox.pdfparser.PDFParser.parse(PDFParser.java:194) 
    at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1219) 
    at org.apache.pdfbox.pdmodel.PDDocument.load(PDDocument.java:1186) 
    at Worker.main(Worker.java:27) 
Caused by: java.io.IOException: Push back buffer is full 
    at java.io.PushbackInputStream.unread(Unknown Source) 
    at org.apache.pdfbox.io.PushBackInputStream.unread(PushBackInputStream.java:144) 
    at org.apache.pdfbox.io.PushBackInputStream.unread(PushBackInputStream.java:133) 
    at org.apache.pdfbox.pdfparser.BaseParser.parseCOSStream(BaseParser.java:550) 
    ... 5 more 
+0

Geri itme arabelleği boyutunu artırdığınızda ne olur? – azurefrog

+0

Şimdiye kadar nasıl yapacağımı bulamadım. – user2958571

+1

Kendi hata iletiniz şöyle diyor: 'Sistem özelliğini kullanarak geri itme arabelleği artırmayı deneyin org.apache.pdfbox.baseParser.pushBackSize' – azurefrog

cevap

2

Birincisi, cari tampon boyutunu bulmak: Artık, bir temel var o da anlaşılacağı tam olarak ne yapmak

System.out.println(System.getProperty("org.apache.pdfbox.baseParser.pushBackSize")); 

. sadece bu kullanılarak basılmış yukarıda ne tampon boyutunu artırma: Çalışır kadar

System.setProperty("org.apache.pdfbox.baseParser.pushBackSize", "<buffer size>"); 

Tut tampon boyutunu artırarak. Umarım öbeklerinizi arttırırsanız hafızanız bitmez.

Sistem özelliklerini çalışma zamanında nasıl belirlersiniz. Bunu bir argüman olarak da iletebilirsiniz, ancak ana başlangıcına yakın bir ayarın hile yapmasını ve gelecekteki geliştiricilerin projeyi sürdürmesini kolaylaştırdığını düşünüyorum.

Büyük nedenlerle, büyük dosyaları ile sayfayı yüklemek için yeterince büyük bir arabelleği yok. Belki de sayfa bir görüntü haline getirilmeden önce veya bir arabelleğe yüklenir. Tahminim, PDF'deki DPI'nın çok yüksek ve arabelleğe sığamayacağı.

+0

Cevabınız mükemmeldir. son paragraf için. "Eski" ayrıştırıcıda, akış yanlış bir uzunluğa sahip olduğunda, yani PDF hatalı biçimlendirildiğinde ("Belirtilen akış uzunluğu 72435 yanlıştır" mesajı), itme tamponu kullanılır. Bu durumda, ayrıştırıcı "geri gitmeli" ve varsayılan geribölme uzunluğu 65536, yani "bom" olmalıdır. –

+0

@guyfleeman pdfbox için özelliklerin listesi nerede bulunabilir? – XY6

2

1.8. * PDFBox sürümleri için alternatif bir çözüm, sıralı olmayan ayrıştırıcıyı kullanmaktır. Bu durumda, kod

doc = PDDocument.load(input); 

ancak

doc = PDDocument.loadNonSeq(input, null); 

(yaklaşan 2.0 versiyonu tek olacaktır) bu ayrıştırıcı bir geri itme tampon boyutu bağımsızdır olmaz.

1

Hataya dayanan büyük bir pdf dosyasıyla ilişkili olduğunu düşündüğüm benzer bir sorunla karşılaştım, ancak bu sorun ortaya çıktı. Bozuk bir pdf dosyası olduğu ortaya çıktı.

Kullanım durumumuz için, projemizde, bizim programımızda pişirilen bir kaynak olarak pdf şablon dosyası (form değerlerini programsal olarak doldurduk) vardı.

Referans için gördüğüm istisna: org.apache.pdfbox.exceptions.WrappedIOException: Could not push back 480478 bytes in order to reparse stream. Try increasing push back buffer using system property org.apache.pdfbox.baseParser.pushBackSize. Mülkünü ekledik ve sonra tekrar işledik ve farklı bir sorunumuz var.

Sonraki yığın izi, "TimesNewRoman, Bold" için gömülü TTF okuyamadı. Savaşın patlamasından ve pdf dosyasını savaşta açmaya çalıştıktan sonra bir süre aramızda kaldık, bunun bozuk olduğunu fark ettik, fakat kaynakta bulunan pdf dosyası bozuk değildi ve sorun olmadan açılabiliyordu.

Sorunumuzun temel nedeni, kaynak klasörümüz için pomda "filtreleme" eklediğimiz oldu.Bunu sağlık kontrol sayfamızdan bazı değerler almak için bazı yansımalardan yararlanabilmemiz için yaptık, ancak aşağıdaki referanstan yola çıkarak pdf dosyasını bozduk: https://bitbucket.org/petermr/xhtml2stm/issues/12/pdf-files-are-being-corrupted-at-some

Aşağıda, ayarladığımız filtrelemenin bir örneği verilmiştir bizi ısırdı:

<resources> 
    <resource> 
     <directory>src/main/resources</directory> 
     <filtering>true</filtering> 
    </resource> 
</resources> 

Çözümümüz bizim pom bu kaldırmak ve bizim sağlık sayfası için bilgiyi nasıl yeniden işleme oldu.