如何使用iText制作多个页面的PDF Java
问题描述:
我有一个包含水果的列表,我试图通过使用for循环将列表的果实与其数据放入JPanel。我想在屏幕上填写4乘2(总共8)的JPanel到一个页面。在下面的图片中查看结果。如何使用iText制作多个页面的PDF Java
在代码示例中,我没有使用fruitslist,而是使用了一个for循环,代表我拥有11个水果>> for(int i = 0; i < 11; i ++)的列表。 因此,我期望得到的是一个2页的PDF文件。第一个包含8个面板,第二个包含3个面板。我想知道的是,如何让应用程序获得多个分页的PDF,其中一个页面只包含最多8个面板。任何帮助,将不胜感激。
// JFrame中//
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfTemplate;
import com.itextpdf.text.pdf.PdfWriter;
import java.awt.*;
import java.io.FileOutputStream;
import java.util.Date;
import javax.swing.*;
public class SmallList extends JFrame {
GridLayout gridLayout = new GridLayout(0,4);
public SmallList(String name) {
super(name);
setResizable(false);
}
public void addComponentsToPane(final Container pane) {
final JPanel components = new JPanel();
components.setLayout(gridLayout);
for(int i = 0; i < 11; i++) {
JPanel jPanel = new javax.swing.JPanel();
JSeparator seperator = new javax.swing.JSeparator();
JSeparator separator1 = new javax.swing.JSeparator();
JLabel nameLabel = new javax.swing.JLabel();
JLabel unitLabel = new javax.swing.JLabel();
JLabel priceLabel = new javax.swing.JLabel();
JLabel centLabel = new javax.swing.JLabel();
JLabel comma = new javax.swing.JLabel();
jPanel.setBackground(new java.awt.Color(255, 255, 255));
jPanel.setAlignmentX(0.0F);
jPanel.setAlignmentY(0.0F);
jPanel.setMaximumSize(null);
jPanel.setPreferredSize(new java.awt.Dimension(203, 289));
seperator.setBackground(new java.awt.Color(0, 0, 0));
separator1.setBackground(new java.awt.Color(0, 0, 0));
nameLabel.setFont(new java.awt.Font("Tahoma", 0, 14)); // NOI18N
nameLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
unitLabel.setFont(new java.awt.Font("Tahoma", 0, 40)); // NOI18N
unitLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
priceLabel.setFont(new java.awt.Font("Tahoma", 0, 90)); // NOI18N
priceLabel.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
priceLabel.setText(" ");
centLabel.setFont(new java.awt.Font("Tahoma", 0, 55)); // NOI18N
centLabel.setText(" ");
comma.setFont(new java.awt.Font("Tahoma", 0, 36)); // NOI18N
comma.setHorizontalAlignment(javax.swing.SwingConstants.CENTER);
comma.setText(",");
javax.swing.GroupLayout jPanelLayout = new javax.swing.GroupLayout(jPanel);
jPanel.setLayout(jPanelLayout);
jPanelLayout.setHorizontalGroup(
jPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(seperator)
.addComponent(separator1)
.addGroup(jPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(jPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(unitLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(nameLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelLayout.createSequentialGroup()
.addComponent(priceLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 101, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(jPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelLayout.createSequentialGroup()
.addComponent(comma)
.addGap(0, 0, Short.MAX_VALUE))
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelLayout.createSequentialGroup()
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(centLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 77, javax.swing.GroupLayout.PREFERRED_SIZE)))))
.addContainerGap())
);
jPanelLayout.setVerticalGroup(
jPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelLayout.createSequentialGroup()
.addGap(6, 6, 6)
.addComponent(unitLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 34, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(seperator, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(jPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(jPanelLayout.createSequentialGroup()
.addGap(32, 32, 32)
.addGroup(jPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
.addComponent(priceLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 130, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(comma)))
.addGroup(jPanelLayout.createSequentialGroup()
.addGap(29, 29, 29)
.addComponent(centLabel)))
.addGap(32, 32, 32)
.addComponent(separator1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(nameLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 29, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
);
jPanel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
components.add(jPanel);
}
pane.add(components);
print();
}
private void print() {
Date date = new Date();
try {
JFrame f = new JFrame("Productlijst klein");
f.add(this.getComponent(0));
f.setUndecorated(true);
f.pack();
f.setVisible(true);
Document document = new Document(PageSize.A4.rotate());
String fileName = "prijslijst" + date.getTime() + ".pdf";
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(fileName));
document.open();
PdfContentByte cb = writer.getDirectContent();
PdfTemplate template = cb.createTemplate(PageSize.A4.getHeight(), PageSize.A4.getWidth());
Graphics2D g2d = template.createGraphics(f.getWidth(), f.getHeight());
f.paintAll(g2d);
g2d.dispose();
cb.addTemplate(template, 0, 0);
document.close();
} catch (Exception e) {
System.out.println(e);
}
}
/**
* Create the GUI and show it. For thread safety,
* this method is invoked from the
* event dispatch thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
SmallList frame = new SmallList("Fruit - kleine afmeting");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Set up the content pane.
frame.addComponentsToPane(frame.getContentPane());
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
/* Use an appropriate Look and Feel */
try {
//UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
} catch (UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
} catch (IllegalAccessException ex) {
ex.printStackTrace();
} catch (InstantiationException ex) {
ex.printStackTrace();
} catch (ClassNotFoundException ex) {
ex.printStackTrace();
}
/* Turn off metal's use of bold fonts */
UIManager.put("swing.boldMetal", Boolean.FALSE);
//Schedule a job for the event dispatch thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
答
解决方案
而不是使用PDF格式的图形,简单地利用iText让你的表在PDF中。拆分模型(底层数据)和您的图形表示(用户界面或PDF文档)始终是一个好主意,因为这可以让您在将来获得灵活性。
为表示例代码(这很可能是你怎么也得建立你的PDF)可以在iText的网页中找到
https://developers.itextpdf.com/content/itext-7-examples/itext-7-tables明确插入分页符已经问(并回答)这里
how can I make a page break using itext
请提供一个最小的例子显示了正是你尝试创建多页PDF。大部分代码与您关于PDF生成的问题无关。 – Muto
您正在使用低级别方法添加内容(如使用ContentByte所示),您必须自己处理分页符。如果有帮助,您目前正在执行的操作可以被视为绘制在无限大的画布上,而不是添加到页面大小的画布(通过'cb.addTemplate()')。你画了11个标签,你看不到底部3,因为它们是由页面绘制的。 –
感谢您的回复,Muto看看print()方法。问题是我不知道如何创建一个多页面的PDF。这就是我实际要求的。 – Hans