使用Java实现签字功能的示例代码
实现了一个简单的签字功能,同时支持将签字图像保存为PNG格式和将签字添加到PDF文档中。在点击“签字”按钮后,会弹出一个窗口,用户可以在其中绘制签名,绘制完成后可选择保存为PNG图片或将签名添加到指定的PDF文档中。
完整代码
import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import javax.swing.JFileChooser; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Image; import com.itextpdf.text.Rectangle; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfWriter; public class SignatureDemo { public static void main(String[] args) { SignatureFrame frame = new SignatureFrame(); frame.setVisible(true); } } class SignatureFrame extends JFrame { private static final long serialVersionUID = 1L; private JPanel contentPanel; public SignatureFrame() { setTitle("签字"); setSize(800, 600); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); contentPanel = new JPanel(); setContentPane(contentPanel); // 添加按钮,用于触发签名事件 JButton button = new JButton("签字"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { // 显示签名面板 SignaturePanel panel = new SignaturePanel(); int result = JOptionPane.showConfirmDialog(contentPanel, panel, "签字", JOptionPane.OK_CANCEL_OPTION); if (result == JOptionPane.OK_OPTION) { // 获取签名图像并保存到本地 saveSignatureImage(panel.getSignatureImage()); } } }); contentPanel.add(button); } /** * 保存签名图像到本地 */ private void saveSignatureImage(BufferedImage image) { // 打开文件选择器 JFileChooser fileChooser = new JFileChooser(); int result = fileChooser.showSaveDialog(contentPanel); if (result == JFileChooser.APPROVE_OPTION) { // 获取用户选择的文件路径 File file = fileChooser.getSelectedFile(); // 将图像保存为PNG格式 try (OutputStream out = new FileOutputStream(file)) { ImageIO.write(image, "PNG", out); } catch (IOException e) { e.printStackTrace(); } } } } class SignaturePanel extends JPanel { private static final long serialVersionUID = 1L; private BufferedImage signatureImage; public SignaturePanel() { setPreferredSize(new Dimension(400, 300)); setBackground(Color.WHITE); setBorder(BorderFactory.createLineBorder(Color.BLACK)); // 添加鼠标监听器,用于绘制签名 addMouseListener(new MouseAdapter() { @Override public void mousePressed(MouseEvent e) { // 创建新的图像,用于绘制签名 signatureImage = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D g = signatureImage.createGraphics(); g.setColor(Color.BLACK); g.setStroke(new BasicStroke(2)); g.drawLine(e.getX(), e.getY(), e.getX(), e.getY()); g.dispose(); repaint(); } }); addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent e) { // 绘制签名 Graphics2D g = signatureImage.createGraphics(); g.setColor(Color.BLACK); g.setStroke(new BasicStroke(2)); g.drawLine(e.getX(), e.getY(), e.getX(), e.getY()); g.dispose(); repaint(); } }); } public BufferedImage getSignatureImage() { return signatureImage; } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); if (signatureImage != null) { g.drawImage(signatureImage, 0, 0, null); } } } class PDFUtils { /** * 在PDF文档中添加签名 */ public static void addSignatureToPDF(File pdfFile, BufferedImage signatureImage) throws IOException, DocumentException { Rectangle pageSize = new Rectangle(PageSize.A4); Document document = new Document(pageSize); PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfFile.getAbsolutePath() + ".signed.pdf")); document.open(); PdfContentByte canvas = writer.getDirectContent(); // 将签名图像添加到PDF文档中 Image image = Image.getInstance(signatureImage, null); image.scaleToFit(100, 50); float x = (document.right() - image.getScaledWidth()) / 2; float y = (document.top() - image.getScaledHeight()) / 2; canvas.addImage(image, image.getScaledWidth(), 0, 0, image.getScaledHeight(), x, y); document.close(); writer.close(); } }
方法补充
除了上文的方法,我们还可以使用JavaFX或者Swing来实现签字功能,下面是实现方法,希望对大家有所帮助
JavaFX中可以通过使用Canvas实现签字功能。
步骤如下:
1. 创建一个JavaFX应用程序。
2. 创建一个Canvas对象。
3. 重写鼠标事件的方法。
4. 在鼠标移动时,通过Canvas的GraphicsContext对象绘制线条。
代码示例:
public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception{ // 创建画布 Canvas canvas = new Canvas(500, 500); GraphicsContext gc = canvas.getGraphicsContext2D(); // 设置画笔的属性 gc.setLineWidth(2); gc.setStroke(Color.BLACK); // 重写鼠标事件的方法 canvas.setOnMouseDragged(e -> { double x = e.getX(); double y = e.getY(); gc.lineTo(x, y); // 绘制线条 gc.stroke(); // 描边 }); // 创建主场景 Scene scene = new Scene(new Group(canvas), 500, 500); // 显示窗口 primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } }
Swing中可以通过使用JPanel实现签字功能。
步骤如下:
1. 创建一个JFrame窗口。
2. 创建一个JPanel对象。
3. 重写鼠标事件的方法。
4. 在鼠标移动时,通过JPanel的Graphics对象绘制线条。
代码示例:
public class Main extends JFrame { public Main() { // 创建面板 JPanel panel = new JPanel(); // 设置面板的大小和背景色 panel.setPreferredSize(new Dimension(500, 500)); panel.setBackground(Color.WHITE); // 重写鼠标事件的方法 panel.addMouseMotionListener(new MouseMotionAdapter() { @Override public void mouseDragged(MouseEvent e) { Graphics g = panel.getGraphics(); // 设置画笔的属性 ((Graphics2D)g).setStroke(new BasicStroke(2)); g.setColor(Color.BLACK); // 绘制线条 g.drawLine(e.getX(), e.getY(), e.getX(), e.getY()); } }); // 添加面板到窗口中 getContentPane().add(panel); // 设置窗口的属性 setTitle("签字功能"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(500, 500); setLocationRelativeTo(null); setResizable(false); setVisible(true); } public static void main(String[] args) { new Main(); } }
到此这篇关于使用Java实现签字功能的示例代码的文章就介绍到这了,更多相关Java签字内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Spring的编程式事务TransactionTemplate的用法详解
TransactionTemplate提供了一种在代码中进行编程式事务管理的方式,使开发人员能够在方法级别定义事务的开始和结束点,本文介绍了Spring框架中TransactionTemplate的用法,感兴趣的朋友跟随小编一起看看吧2023-07-07Spring Boot ORM 框架JPA使用与连接池 Hikari详解
这篇文章主要介绍了SpringBoot ORM框架JPA与连接池Hikari,主要就是介绍JPA 的使用姿势,本文结合实例代码给大家介绍的非常详细,需要的朋友可以参考下2023-08-08SpringCloud Gateway使用redis实现动态路由的方法
这篇文章主要介绍了SpringCloud Gateway使用redis实现动态路由的方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下2021-01-01
最新评论