【问题标题】:Multiple page print using iText pdf in landscape orientation在横向使用 iText pdf 进行多页打印
【发布时间】:2018-03-15 11:58:54
【问题描述】:

我尝试过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);
    }
}


任何意见将不胜感激

【问题讨论】:

  • 你在document.open()之前尝试过event.setOrientation(PdfPage.LANDSCAPE)吗?
  • 是的,它不起作用。我认为方向是正确的,它是导致此问题的页面大小或尺寸。
  • 请分享有问题的 PDF。
  • 抱歉回复晚了。这是pdf file link。如果您想调试问题,这也是project 的链接。
  • 您可以尝试删除所有event.setOrientation(PdfPage.LANDSCAPE) 调用;这应该会导致所有页面都变成第一个页面。或者您可能想要删除所有代码设置和更改旋转,而是使用new Document(new RectangleReadOnly(842,595)) 实例化Document document,即根本没有任何旋转;由于打印管理器似乎无法正确处理旋转,这也可能导致所需的行为。

标签: android printing itext pdf-generation


【解决方案1】:

PDF 的唯一特点是第一页的页面旋转为 0,而第二页的页面旋转为 90。

这是由于我在第一条评论中暗示的:通过在document.open() 之后执行event.setOrientation(PdfPage.LANDSCAPE),事件侦听器不会旋转第一页,只会旋转所有后续页面。除此之外,所有页面都有一个纵向 A4 页面的媒体框,其中包含旋转的页面填充内容。

正如您所说,更改 event.setOrientationdocument.open 的顺序不会改变行为,有问题的打印管理器似乎有问题。

您可以尝试删除所有event.setOrientation(PdfPage.LANDSCAPE) 调用;这应该会导致所有页面都变成第一个页面。

或者您可能想要删除所有代码设置和更改旋转,而是使用new Document(new RectangleReadOnly(842,595)) 实例化文档文档,即根本没有任何旋转;由于打印管理器似乎无法正确处理旋转,这也可能导致所需的行为。

正如 OP 在评论中报告的那样,

您使用RectangleReadOnly(842,595) 的建议奏效了。

【讨论】:

    猜你喜欢
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-02
    • 2011-04-04
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多