2017-01-10 4 views
0

저장 단추를 클릭하면 PDF로 JEditorPane에서 텍스트를 저장하려고합니다.JEditorPane을 PDF로 저장하는 방법은 무엇입니까?

saveAs.addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 

      String title = JOptionPane.showInputDialog(null, "Enter a name for file..."); 
      try{ 
       paintToPDF(newBlanktoEdit, title); 
      }catch (Exception exc){ 
       exc.printStackTrace(); 
      } 
     } 
    }); 

올바르게 작업을 수행하는 방법은 paintToPDF 그러나 Panegraphics2D 요소로서 해석 등 광고를 배치하는 것은 불가능하다. 나는 외부 라이브러리를 기반으로하는 솔루션을 찾고 있어요

protected void paintToPDF(JEditorPane newPane, String title) throws Exception{ 

    newPane.setBounds(0, 0, (int) convertToPixels(612 - 58), (int) convertToPixels(792 - 60)); 

    Document doc = new Document(); 
    FileOutputStream out = new FileOutputStream(title + ".pdf"); 
    PdfWriter writer = PdfWriter.getInstance(doc, out); 

    doc.setPageSize(new com.lowagie.text.Rectangle(612, 792)); 
    doc.open(); 
    PdfContentByte cb = writer.getDirectContent(); 
    cb.saveState(); 
    cb.concatCTM(1, 0, 0, 1, 0, 0); 

    DefaultFontMapper mapper = new DefaultFontMapper(); 
    mapper.insertDirectory("c:/windows/fonts"); 

    Graphics2D g = cb.createGraphics(612, 792, mapper, true, .92f); 

    AffineTransform at = new AffineTransform(); 
    at.translate(convertToPixels(20), convertToPixels(20)); 
    at.scale(pixelToPoint, pixelToPoint); 

    g.transform(at); 
    g.setColor(Color.WHITE); 
    g.fill(newPane.getBounds()); 

    Rectangle alloc = getVisivleEditorRect(newPane); 
    newPane.getUI().getRootView(newPane).paint(g, alloc); 

    g.setColor(Color.BLACK); 
    g.draw(newPane.getBounds()); 

    g.dispose(); 
    cb.restoreState(); 
    doc.close(); 
    out.flush(); 
    out.close(); 
} 

private float convertToPixels(int points){ 

    return (float) (points/pixelToPoint); 
} 

private Rectangle getVisivleEditorRect(JEditorPane newPane){ 

    Rectangle alloc = newPane.getBounds(); 
    if((alloc.width > 0) && (alloc.height > 0)){ 
     alloc.x = alloc.y = 0; 
     Insets insets = newPane.getInsets(); 
     alloc.x += insets.left; 
     alloc.y += insets.top; 
     alloc.width -= insets.left + insets.right; 
     alloc.height -= insets.top + insets.bottom; 
     return alloc; 
    } 
    return null; 
} 

,

int inch = Toolkit.getDefaultToolkit().getScreenResolution(); 
float pixelToPoint = (float) 72/(float) inch; 

, 내가 지금까지 아무 소용, iText를하고 PDFBox와 expermenting 시도.

위의 솔루션이 com.lowagie 라이브러리를 사용하고 있음을 지적하고 싶습니다.

+0

당신은 편집기 창 또는 텍스트의 형태를 저장할은? – Frakcool

+0

텍스트를 명확히하기 위해서 (때문에), 당신이 염두에두고있는 해결책에 응해, JEditorPane를 JtextPane 또는 JTextArea로 변경할 수 있습니다. –

+0

먼저 StandardPrint를 사용하여 JEditorPane (또는 다른 구성 요소) 디스플레이를 이미지로 변환 한 다음 lowagie를 사용하여 PDF로 변환 할 수 있습니다. https://sourceforge.net/p/tus/code/HEAD/tree/tjacobs/ print/StandardPrint.java – ControlAltDel

답변

1

GUI에서 이미지로 변환하고 PDF로 인쇄하고 싶습니다. 원하지 않는 경우 명확하게하십시오.

다음은 GUI가 작성된 간단한 프로그램입니다 (텍스트는 쓰지 않습니다). JTextAreaJButton입니다.

enter image description here

클릭하면, 버튼을, 새로운 문서를 엽니 다 지역을 소요하고 이미지로 변환 후 PDF에 해당 이미지를 추가하고 나중에 비슷한 얻을 수 있도록 버튼과 같은 작업을 수행 이와 같은 PDF 출력 :

enter image description here

트릭은 이미지와 PDF에서 그들을 인쇄 후자에 JComponent를 변환하는 두 java.awt.Imagecom.itextpdf.text.Image, 전자를 사용하는 것입니다,이 트릭이 발견되었다 이 peeskillet의 answer.

그래서 더 설명하지 않고, 여기에 위의 결과를 달성하는 코드입니다 :

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.awt.image.BufferedImage; 
import java.io.FileNotFoundException; 
import java.io.FileOutputStream; 
import java.io.IOException; 

import javax.swing.BorderFactory; 
import javax.swing.JButton; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 

import com.itextpdf.text.Document; 
import com.itextpdf.text.DocumentException; 
import com.itextpdf.text.Image; 
import com.itextpdf.text.PageSize; 
import com.itextpdf.text.pdf.PdfWriter; 

public class PdfFromUserInput { 

    private JFrame frame; 
    private JTextArea area; 
    private JButton button; 
    private Document document; 
    private PdfWriter writer; 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new PdfFromUserInput().createAndShowGui(); 
      } 
     }); 
    } 

    public void openPdf() throws FileNotFoundException, DocumentException { 
     document = new Document(PageSize.A4, 30, 30, 30, 30); 
     writer = PdfWriter.getInstance(document, new FileOutputStream("myFile.pdf")); 
     document.open(); 
    } 

    public void closePdf() { 
     document.close(); 
    } 

    public java.awt.Image getImageFromComponent(JComponent component) throws DocumentException { 
     BufferedImage image = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_RGB); 
     component.paint(image.getGraphics()); 
     return image; 
    } 

    public void addImageToDocument(java.awt.Image img) throws IOException, DocumentException { 
     Image image = Image.getInstance(writer, img, 1); 
     image.scalePercent(50); 
     document.add(image); 
     System.out.println("printed!"); 
    } 

    public void createAndShowGui() { 
     frame = new JFrame("PDF creator"); 
     area = new JTextArea(10, 30); 
     area.setBorder(BorderFactory.createLineBorder(Color.RED)); 
     button = new JButton("Create PDF"); 

     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       try { 
        openPdf(); 
        java.awt.Image img = getImageFromComponent(area); 
        addImageToDocument(img); 
        img = getImageFromComponent(button); 
        addImageToDocument(img); 
        closePdf(); 
       } catch (DocumentException e1) { 
        e1.printStackTrace(); 
       } catch (FileNotFoundException e1) { 
        e1.printStackTrace(); 
       } catch (IOException e1) { 
        e1.printStackTrace(); 
       } 
      } 
     }); 

     frame.add(area, BorderLayout.CENTER); 
     frame.add(button, BorderLayout.SOUTH); 

     frame.pack(); 
     frame.setVisible(true); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 
관련 문제