使用 iText pdf 横向打印多页
Multiple page print using iText pdf in landscape orientation
我已经尝试 itextPdf_page_orientation 但问题是 - 只有第一页是正确的其余所有页面都打印在一半区域。
这是一张图片,可以帮助您理解问题。
我已尝试设置页面大小 PdfPage.A4.rotate()
并将事件设置为 PdfWritter。
这是代码片段。
@Override
protected String doInBackground(Void... params) {
final String PARENT_PATH =
Environment.getExternalStorageDirectory().getPath() + "/.GSTInvoice";
Document document = null;
try {
File file = new File(PARENT_PATH);
if (!file.exists()) {
file.mkdirs();
}
File pdfFile = new File(file, "last_sales_summary");
document = new Document();
document.setPageSize(PageSize.A4.rotate());
event = new RotateEvent();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfFile));
writer.setPageEvent(event);
document.open();
event.setOrientation(PdfPage.LANDSCAPE);
taxList = new ArrayList<>();
PdfContentByte cb = writer.getDirectContent();
printPage(document, writer, cb);
if (document != null && document.isOpen()) {
document.close();
}
return pdfFile.getPath();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (document != null && document.isOpen()) {
document.close();
}
}
return null;
}
private void printPage(Document document, PdfWriter pdfWriter, PdfContentByte pdfContentByte) throws Exception{
int noOfPages = getNoOfPages();
BaseFont latoLight = BaseFont.createFont("assets/Lato-Light.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font light = new Font(latoLight, 8);
for (int i=1;i<=noOfPages;i++) {
if (i != 1) {
document.newPage();
pdfWriter.setPageSize(PageSize.A4.rotate());
event.setOrientation(PdfPage.LANDSCAPE);
document.setPageSize(PageSize.A4.rotate());
}
addTopPart(document);
addMiddleTable(document, i);
if (noOfPages>1) {
Paragraph paragraph = new Paragraph(new Phrase("Page " + i + "/" + noOfPages, light));
paragraph.setAlignment(Element.ALIGN_CENTER);
paragraph.setSpacingBefore(8f);
ColumnText.showTextAligned(pdfContentByte, Element.ALIGN_CENTER,
paragraph,
(document.right() - document.left()) / 2 + document.leftMargin(),
document.bottom() - 10, 0);
}
event.setOrientation(PdfPage.LANDSCAPE);
}
}
任何输入将不胜感激
PDF 的唯一特点是第一页的页面旋转为 0,而第二页的页面旋转为 90。
这是由于我在第一条评论中暗示的:通过在 document.open()
之后执行 event.setOrientation(PdfPage.LANDSCAPE)
,事件侦听器不会轮换第一页,而只会轮换所有后续页。除此之外,所有页面都有一个纵向 A4 页面的媒体框,其中包含旋转的页面填充内容。
正如您指出更改 event.setOrientation
和 document.open
的顺序不会改变行为一样,有问题的打印管理器似乎有问题。
您可能会尝试删除所有 event.setOrientation(PdfPage.LANDSCAPE)
个调用;这应该会导致所有页面都变得像第一个一样。
或者您可能想要删除所有代码设置和更改旋转,而是使用 new Document(new RectangleReadOnly(842,595))
实例化 Document 文档,即根本没有任何旋转;由于打印管理器似乎无法正确处理旋转,这也可能会导致所需的行为。
正如 OP 在评论中所报道的那样,
your suggestion to use RectangleReadOnly(842,595)
worked.
我已经尝试 itextPdf_page_orientation 但问题是 - 只有第一页是正确的其余所有页面都打印在一半区域。
这是一张图片,可以帮助您理解问题。
我已尝试设置页面大小 PdfPage.A4.rotate()
并将事件设置为 PdfWritter。
这是代码片段。
@Override
protected String doInBackground(Void... params) {
final String PARENT_PATH =
Environment.getExternalStorageDirectory().getPath() + "/.GSTInvoice";
Document document = null;
try {
File file = new File(PARENT_PATH);
if (!file.exists()) {
file.mkdirs();
}
File pdfFile = new File(file, "last_sales_summary");
document = new Document();
document.setPageSize(PageSize.A4.rotate());
event = new RotateEvent();
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(pdfFile));
writer.setPageEvent(event);
document.open();
event.setOrientation(PdfPage.LANDSCAPE);
taxList = new ArrayList<>();
PdfContentByte cb = writer.getDirectContent();
printPage(document, writer, cb);
if (document != null && document.isOpen()) {
document.close();
}
return pdfFile.getPath();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (document != null && document.isOpen()) {
document.close();
}
}
return null;
}
private void printPage(Document document, PdfWriter pdfWriter, PdfContentByte pdfContentByte) throws Exception{
int noOfPages = getNoOfPages();
BaseFont latoLight = BaseFont.createFont("assets/Lato-Light.ttf", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
Font light = new Font(latoLight, 8);
for (int i=1;i<=noOfPages;i++) {
if (i != 1) {
document.newPage();
pdfWriter.setPageSize(PageSize.A4.rotate());
event.setOrientation(PdfPage.LANDSCAPE);
document.setPageSize(PageSize.A4.rotate());
}
addTopPart(document);
addMiddleTable(document, i);
if (noOfPages>1) {
Paragraph paragraph = new Paragraph(new Phrase("Page " + i + "/" + noOfPages, light));
paragraph.setAlignment(Element.ALIGN_CENTER);
paragraph.setSpacingBefore(8f);
ColumnText.showTextAligned(pdfContentByte, Element.ALIGN_CENTER,
paragraph,
(document.right() - document.left()) / 2 + document.leftMargin(),
document.bottom() - 10, 0);
}
event.setOrientation(PdfPage.LANDSCAPE);
}
}
任何输入将不胜感激
PDF 的唯一特点是第一页的页面旋转为 0,而第二页的页面旋转为 90。
这是由于我在第一条评论中暗示的:通过在 document.open()
之后执行 event.setOrientation(PdfPage.LANDSCAPE)
,事件侦听器不会轮换第一页,而只会轮换所有后续页。除此之外,所有页面都有一个纵向 A4 页面的媒体框,其中包含旋转的页面填充内容。
正如您指出更改 event.setOrientation
和 document.open
的顺序不会改变行为一样,有问题的打印管理器似乎有问题。
您可能会尝试删除所有 event.setOrientation(PdfPage.LANDSCAPE)
个调用;这应该会导致所有页面都变得像第一个一样。
或者您可能想要删除所有代码设置和更改旋转,而是使用 new Document(new RectangleReadOnly(842,595))
实例化 Document 文档,即根本没有任何旋转;由于打印管理器似乎无法正确处理旋转,这也可能会导致所需的行为。
正如 OP 在评论中所报道的那样,
your suggestion to use
RectangleReadOnly(842,595)
worked.