Itext 5 Table 行拆分到新页面并重复
Itext 5 Table rows splitting to new page and repeating
我是第一次使用 itext 5 legacy,我是应用程序开发的新手。
我正在生成一个 table,它不断将列拆分为新页面上的新行,它会重复数据。
第一个Table:
第二个 table 具有拆分列和重复数据:
第三个table:
第四个table:
第五个Table:
table 必须是一长行。
请帮我纠正一下,
代码如下:
private void createPdf() throws FileNotFoundException, DocumentException,IOException {
// getIntent().setType("application/pdf");
Toast.makeText(this,"GENERATING PDF ..."+ directory_path,Toast.LENGTH_LONG).show();
File file = new File(directory_path+filename);
if (!file.exists())
{
file.mkdirs();
}
ProductCondition prodCond = new ProductCondition(true,"GREEN","BFobrourinbiurfufbjfnbbu");
ProductOperations prodOper = new ProductOperations(true,true,true,1000,986,500,"OBNobdfiuvdob");
Product product = new Product("bkbukb","sfdvsf","sdfsdfs","1sfdssV45",prodCond,prodOper);
technicians.addProduct(product);
Document document = new Document(PageSize.A1.rotate());
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(directory_path+filename));
document.open();
PdfPTable table = new PdfPTable(15);
table.setTotalWidth(5000);
table.setWidthPercentage(100);
List<String> listData =new ArrayList<>() ;
listData = GetTechnicianData(technicians);
Image image1 = GetImage();
Image image2 = GetImage();
table.addCell("Bloop");
table.addCell("han Solo");
table.addCell("Hamburger");
table.addCell("NUmber time");
table.addCell("boogaloo");
table.addCell("Boo thang");
table.addCell("Spanish");
table.addCell("Inquisition");
table.addCell("Never ");
table.addCell("Death");
table.addCell("Test ");
// table.addCell("Button");
table.addCell("Lights");
table.addCell("Sunshine");
table.addCell("Comment");
table.addCell("Images");
table.setHeaderRows(3);
table.setFooterRows(1);
table.getDefaultCell().setBackgroundColor(GrayColor.GRAYWHITE);
PdfPCell cell;
Toast.makeText(this,"ADDING PRELIMINARY DATA",Toast.LENGTH_LONG).show();
for (int c = 0; c < 14; c++) {
cell = new PdfPCell();
cell.setFixedHeight(50);
cell.addElement(new Paragraph(listData.get(c)));
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
//cell.setBorder(PdfPCell.NO_BORDER);
table.addCell(cell);
table.setKeepTogether(true);
}
Paragraph p = new Paragraph();
p.add(new Chunk(image1,0,0,true));
p.add(new Chunk(image2,0,0,true));
cell = new PdfPCell();
cell.addElement(p);
//cell.setBorder(PdfPCell.NO_BORDER);
table.addCell(cell);
//document.add(table);
Toast.makeText(this,"ADDING IMAGES...",Toast.LENGTH_LONG).show();
/* cell = new PdfPCell();
Paragraph p = new Paragraph();
p.add(new Chunk(image1,0,0,true));
p.add(new Chunk(image1,0,0,true));
cell.addElement(p);
table.addCell(cell);*/
// document.add(table);
PdfContentByte canvas = writer.getDirectContent();
PdfTemplate tableTemplate = canvas.createTemplate(5000, 2600);
table.writeSelectedRows(0, -1, 0, 800, tableTemplate);
PdfTemplate clip;
for (int j = 0; j <5000; j += 1000) {
table.setKeepTogether(true);
document.newPage();
for (int i = 2600; i > 0; i -= 1300) {
clip = canvas.createTemplate(2000, 1300);
clip.addTemplate(tableTemplate, -j, 1750 - i);
canvas.addTemplate(clip, 50, 312);
table.setKeepTogether(true);
//canvas.addImage(image1);
}
}
// byte [] pdf = Files.readAllBytes(file.toPath());
Uri filepdf = Uri.fromFile(new File(directory_path+filename));
UploadTask uploadTask = storageReference.child(technicians.getEmailAddress()).child("PDFUpdate").putFile(filepdf);
Toast.makeText(this,"PDF Generated Successfully",Toast.LENGTH_LONG).show();
document.close();
/* PackageManager packageManager = context.getPackageManager();
Intent testIntent = new Intent(Intent.ACTION_VIEW);
testIntent.setType("application/pdf");
List list = packageManager.queryIntentActivities(testIntent, PackageManager.MATCH_DEFAULT_ONLY);
if (list.size() > 0) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "application/pdf");
context.startActivity(intent);
} else {
Toast.makeText(context, "Download a PDF Viewer to see the generated PDF", Toast.LENGTH_SHORT).show();
}
*/
}
private void createPdfWrapper() throws FileNotFoundException, DocumentException ,IOException{
int hasWriteStoragePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (hasWriteStoragePermission != PackageManager.PERMISSION_GRANTED) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
showMessageOKCancel("You need to allow access to Storage",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ActivityCompat.requestPermissions(CentralHome.this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_CODE_ASK_PERMISSIONS);
}
}
});
return;
}
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_CODE_ASK_PERMISSIONS);
return;
}
} else {
createPdf();
}
}
private Image GetImage() throws BadElementException,IOException{
Drawable d = getResources().getDrawable(R.drawable.logo);
BitmapDrawable bitDw = ((BitmapDrawable) d);
Bitmap bmp = bitDw.getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
Image image = Image.getInstance(stream.toByteArray());
image.scalePercent(10);
return image;
// document.add(image);
}
}
在 createPdf
中,您有一个循环将模板的部分与整个 table 添加到单独的页面:
for (int j = 0; j <5000; j += 1000) {
table.setKeepTogether(true);
document.newPage();
for (int i = 2600; i > 0; i -= 1300) {
clip = canvas.createTemplate(2000, 1300);
clip.addTemplate(tableTemplate, -j, 1750 - i);
canvas.addTemplate(clip, 50, 312);
table.setKeepTogether(true);
//canvas.addImage(image1);
}
}
每个部分都是 2000 个单位宽 (canvas.createTemplate(2000, 1300)
),但是当前进到下一个部分时,您只能向右走 1000 个单位 (j += 1000
)。因此,每个新部分(第一部分除外)重复前一部分的最后三列(后半部分)。
您可以通过在每个部分后向右移动 2000 个单位来防止这些重复,即通过替换
for (int j = 0; j <5000; j += 1000)
来自
for (int j = 0; j <5000; j += 2000)
顺便说一句,您的代码中还有许多其他怪异之处,例如
table.setHeaderRows(3);
table.setFooterRows(1);
(这里你声明如果 table 直接添加到 Document
并拆分为多个页面,你有三行 header 行和一个页脚行自动重复;作为您不将 table 添加到 Document
而是手动添加到模板,该功能未被使用 这是幸运的,因为您只创建了足够的单元格来填充两行,甚至不足以声明 header 行)
和多次调用
table.setKeepTogether(true)
after 已经在
中渲染了 table
table.writeSelectedRows(0, -1, 0, 800, tableTemplate)
渲染 table 之后设置控制渲染过程的属性为时已晚...
您在评论中说您只想拥有一个普通的 15 列 table,而不是那些列分布在多个页面上的列。在那种情况下,你为什么不简单地做
Document document = new Document(PageSize.A1.rotate());
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(directory_path+filename));
document.open();
PdfPTable table = new PdfPTable(15);
table.setWidthPercentage(100);
... create cells and add them to the table ...
document.add(table);
document.close();
PdfContentByte
、PdfTemplate
和 writeSelectedRows
的所有用法对于您的用例来说完全没有必要。
我是第一次使用 itext 5 legacy,我是应用程序开发的新手。 我正在生成一个 table,它不断将列拆分为新页面上的新行,它会重复数据。
第一个Table:
第三个table:
第四个table:
第五个Table:
table 必须是一长行。 请帮我纠正一下,
代码如下:
private void createPdf() throws FileNotFoundException, DocumentException,IOException {
// getIntent().setType("application/pdf");
Toast.makeText(this,"GENERATING PDF ..."+ directory_path,Toast.LENGTH_LONG).show();
File file = new File(directory_path+filename);
if (!file.exists())
{
file.mkdirs();
}
ProductCondition prodCond = new ProductCondition(true,"GREEN","BFobrourinbiurfufbjfnbbu");
ProductOperations prodOper = new ProductOperations(true,true,true,1000,986,500,"OBNobdfiuvdob");
Product product = new Product("bkbukb","sfdvsf","sdfsdfs","1sfdssV45",prodCond,prodOper);
technicians.addProduct(product);
Document document = new Document(PageSize.A1.rotate());
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(directory_path+filename));
document.open();
PdfPTable table = new PdfPTable(15);
table.setTotalWidth(5000);
table.setWidthPercentage(100);
List<String> listData =new ArrayList<>() ;
listData = GetTechnicianData(technicians);
Image image1 = GetImage();
Image image2 = GetImage();
table.addCell("Bloop");
table.addCell("han Solo");
table.addCell("Hamburger");
table.addCell("NUmber time");
table.addCell("boogaloo");
table.addCell("Boo thang");
table.addCell("Spanish");
table.addCell("Inquisition");
table.addCell("Never ");
table.addCell("Death");
table.addCell("Test ");
// table.addCell("Button");
table.addCell("Lights");
table.addCell("Sunshine");
table.addCell("Comment");
table.addCell("Images");
table.setHeaderRows(3);
table.setFooterRows(1);
table.getDefaultCell().setBackgroundColor(GrayColor.GRAYWHITE);
PdfPCell cell;
Toast.makeText(this,"ADDING PRELIMINARY DATA",Toast.LENGTH_LONG).show();
for (int c = 0; c < 14; c++) {
cell = new PdfPCell();
cell.setFixedHeight(50);
cell.addElement(new Paragraph(listData.get(c)));
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
//cell.setBorder(PdfPCell.NO_BORDER);
table.addCell(cell);
table.setKeepTogether(true);
}
Paragraph p = new Paragraph();
p.add(new Chunk(image1,0,0,true));
p.add(new Chunk(image2,0,0,true));
cell = new PdfPCell();
cell.addElement(p);
//cell.setBorder(PdfPCell.NO_BORDER);
table.addCell(cell);
//document.add(table);
Toast.makeText(this,"ADDING IMAGES...",Toast.LENGTH_LONG).show();
/* cell = new PdfPCell();
Paragraph p = new Paragraph();
p.add(new Chunk(image1,0,0,true));
p.add(new Chunk(image1,0,0,true));
cell.addElement(p);
table.addCell(cell);*/
// document.add(table);
PdfContentByte canvas = writer.getDirectContent();
PdfTemplate tableTemplate = canvas.createTemplate(5000, 2600);
table.writeSelectedRows(0, -1, 0, 800, tableTemplate);
PdfTemplate clip;
for (int j = 0; j <5000; j += 1000) {
table.setKeepTogether(true);
document.newPage();
for (int i = 2600; i > 0; i -= 1300) {
clip = canvas.createTemplate(2000, 1300);
clip.addTemplate(tableTemplate, -j, 1750 - i);
canvas.addTemplate(clip, 50, 312);
table.setKeepTogether(true);
//canvas.addImage(image1);
}
}
// byte [] pdf = Files.readAllBytes(file.toPath());
Uri filepdf = Uri.fromFile(new File(directory_path+filename));
UploadTask uploadTask = storageReference.child(technicians.getEmailAddress()).child("PDFUpdate").putFile(filepdf);
Toast.makeText(this,"PDF Generated Successfully",Toast.LENGTH_LONG).show();
document.close();
/* PackageManager packageManager = context.getPackageManager();
Intent testIntent = new Intent(Intent.ACTION_VIEW);
testIntent.setType("application/pdf");
List list = packageManager.queryIntentActivities(testIntent, PackageManager.MATCH_DEFAULT_ONLY);
if (list.size() > 0) {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
Uri uri = Uri.fromFile(file);
intent.setDataAndType(uri, "application/pdf");
context.startActivity(intent);
} else {
Toast.makeText(context, "Download a PDF Viewer to see the generated PDF", Toast.LENGTH_SHORT).show();
}
*/
}
private void createPdfWrapper() throws FileNotFoundException, DocumentException ,IOException{
int hasWriteStoragePermission = ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE);
if (hasWriteStoragePermission != PackageManager.PERMISSION_GRANTED) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
if (!ActivityCompat.shouldShowRequestPermissionRationale(this,Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
showMessageOKCancel("You need to allow access to Storage",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
ActivityCompat.requestPermissions(CentralHome.this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_CODE_ASK_PERMISSIONS);
}
}
});
return;
}
ActivityCompat.requestPermissions(this,new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
REQUEST_CODE_ASK_PERMISSIONS);
return;
}
} else {
createPdf();
}
}
private Image GetImage() throws BadElementException,IOException{
Drawable d = getResources().getDrawable(R.drawable.logo);
BitmapDrawable bitDw = ((BitmapDrawable) d);
Bitmap bmp = bitDw.getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
Image image = Image.getInstance(stream.toByteArray());
image.scalePercent(10);
return image;
// document.add(image);
}
}
在 createPdf
中,您有一个循环将模板的部分与整个 table 添加到单独的页面:
for (int j = 0; j <5000; j += 1000) {
table.setKeepTogether(true);
document.newPage();
for (int i = 2600; i > 0; i -= 1300) {
clip = canvas.createTemplate(2000, 1300);
clip.addTemplate(tableTemplate, -j, 1750 - i);
canvas.addTemplate(clip, 50, 312);
table.setKeepTogether(true);
//canvas.addImage(image1);
}
}
每个部分都是 2000 个单位宽 (canvas.createTemplate(2000, 1300)
),但是当前进到下一个部分时,您只能向右走 1000 个单位 (j += 1000
)。因此,每个新部分(第一部分除外)重复前一部分的最后三列(后半部分)。
您可以通过在每个部分后向右移动 2000 个单位来防止这些重复,即通过替换
for (int j = 0; j <5000; j += 1000)
来自
for (int j = 0; j <5000; j += 2000)
顺便说一句,您的代码中还有许多其他怪异之处,例如
table.setHeaderRows(3);
table.setFooterRows(1);
(这里你声明如果 table 直接添加到 Document
并拆分为多个页面,你有三行 header 行和一个页脚行自动重复;作为您不将 table 添加到 Document
而是手动添加到模板,该功能未被使用 这是幸运的,因为您只创建了足够的单元格来填充两行,甚至不足以声明 header 行)
和多次调用
table.setKeepTogether(true)
after 已经在
中渲染了 tabletable.writeSelectedRows(0, -1, 0, 800, tableTemplate)
渲染 table 之后设置控制渲染过程的属性为时已晚...
您在评论中说您只想拥有一个普通的 15 列 table,而不是那些列分布在多个页面上的列。在那种情况下,你为什么不简单地做
Document document = new Document(PageSize.A1.rotate());
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(directory_path+filename));
document.open();
PdfPTable table = new PdfPTable(15);
table.setWidthPercentage(100);
... create cells and add them to the table ...
document.add(table);
document.close();
PdfContentByte
、PdfTemplate
和 writeSelectedRows
的所有用法对于您的用例来说完全没有必要。