2011-08-14 33 views
8

Trong dự án hiện tại của tôi, tôi cố gắng thêm một BufferedImage vào tài liệu PDFBox. Cụ thể hơn, tôi sử dụng hình ảnh từ JFreeChart. Mã của tôi trông giống như sau:Thêm BufferedImage vào tài liệu PDFBox

public void exportToPDF(JFreeChart chart, String filePath){ 
    PDDocument doc = null; 
    PDPage page = null; 
    PDXObjectImage ximage = null; 

    try { 
     doc = new PDDocument(); 
     page = new PDPage(); 
     doc.addPage(page); 
     PDPageContentStream content = new PDPageContentStream(doc, page); 
     BufferedImage image = chart.createBufferedImage(300, 300); 
     ximage = new PDJpeg(doc, image); 
     content.drawImage(ximage, 20, 20); 
     content.close(); 
    } catch(IOException ie) { 
    } 
    doc.save(filePath); 
    doc.close(); 
} 

Tài liệu được tạo; Tôi có thể thêm văn bản, nhưng tôi nhận được thông báo lỗi cho biết hình ảnh không có đủ thông tin để hiển thị.

Bất kỳ đầu mối nào đến những gì tôi đang làm sai?

+0

lỗi là gì? – leonm

+0

Thông báo lỗi được hiển thị trong tệp pdf được tạo, tôi phải rõ ràng về điều đó. Khi tôi mở tập tin, nó sẽ làm xáo trộn tất cả văn bản, nhưng thay vì một hình ảnh, tôi nhận được thông báo "Không đủ dữ liệu để hiển thị hình ảnh". Im nhiều hơn hoặc ít màu xanh lá cây khi nói đến hình ảnh siplaying vì vậy bất kỳ ý tưởng được hoan nghênh – Oglop

+0

Đây có thể là lỗi này: https://issues.apache.org/jira/browse/PDFBOX-2026 Nó sẽ được cố định trong 1.8.5. Hoặc tải xuống ảnh chụp nhanh. –

Trả lời

7

Cảm ơn vì đã giúp tôi trong thùng rác. Đã dành đêm qua và một vài giờ hôm nay ong bối rối về PipedIn/OutStreams. Không thể tìm ra. Tuy nhiên, tôi đã làm cho nó hoạt động. Hóa ra nó không khó lắm.

public void exportToPDF(JFreeChart chart, String filePath){ 
    PDDocument doc = null; 
    PDPage page = null; 
    PDXObjectImage ximage = null; 
    try { 
     doc = new PDDocument(); 
     page = new PDPage(); 
     doc.addPage(page); 
     PDPageContentStream content = new PDPageContentStream(doc, page); 

     //create a new outStream 
     ByteArrayOutputStream out = new ByteArrayOutputStream(); 
     ChartUtilities.writeChartAsJPEG(out, chart, 300, 300);//write to outstream 
     //create a new inputstream 
     InputStream in = new ByteArrayInputStream(out.toByteArray()); 
     ximage = new PDJpeg(doc, in); 
     content.drawImage(ximage, 5, 300); 
     content.close(); 
    } 
    catch (IOException ie){ 
     //handle exception 
    } 
    //save and close 
    doc.save(filePath); 
    doc.close(); 
} 

Tôi chắc rằng điều này có thể được thực hiện tốt hơn nhưng nó hoạt động.

3

Hai điều nổi bật:

  • Đừng nuốt ngoại lệ.

  • Sử dụng ChartUtilities để hiển thị hình ảnh ở định dạng phù hợp, như được đề xuất here.

+0

Vì vậy, tôi nhìn vào những gì bạn nói, tôi có thể nhận được một outputStream bằng cách sử dụng: OutputStream out = new ByteArrayOutputStream(); và sau đó: ChartUtilities.writeChartAsJPEG (ra, biểu đồ, 300, 300); Tuy nhiên, tôi không thể tìm ra cách để biến điều này thành một inputstream. – Oglop

+0

Để di chuyển dữ liệu từ 'OutputStream' sang luồng đường dẫn sử dụng' InputStream', hiển thị [ở đây] (http://stackoverflow.com/questions/4443878/redirecting-system-out-to-jtextpane/4444677#4444677) và [tại đây] (http://stackoverflow.com/questions/484119/why-doesnt-more-java-code-use-pipedinputstream-pipedoutputstream). – trashgod

+0

Ngoài ra, bạn chỉ có thể lưu hình ảnh dưới dạng tệp hoặc lưu vào bộ nhớ mảng byte của nó. Cũng xem xét 'PNG' v' JPG' [tradeoff] (http://www.turnkeylinux.org/blog/png-vs-jpg). – trashgod

5

Có một cách dễ dàng để chèn một JFreeChart thành một pdf với pdfbox:

BufferedImage bufferedImage = source.getChart().createBufferedImage(source.getWidth(), 
     source.getHeight(), BufferedImage.TYPE_INT_RGB, null); 
PDXObjectImage ximage = new PDJpeg(doc, bufferedImage); 

Nếu không có bất kỳ dòng;)

+0

Điều này có vẻ là những gì tôi đang tìm kiếm trở lại sau đó. Tuyệt quá! – Oglop

Các vấn đề liên quan