调整IText pdf的大小,使文本适合一页

时间:2014-02-07 12:33:40

标签: java pdf resize itext

我正在使用标签打印机打印我的pdf文件。我创建这样的文件:

public static Document createPDF() {
float pageWidth = 176f;
    float pageHeight = 200f;

    Rectangle pageSize = new Rectangle(pageWidth, pageHeight);
    Document document = new Document(pageSize);
    document.setMargins(5, 5, 1, 0);
    String file = MainActivity.FILE_URI;
    try {
        PdfWriter.getInstance(document,new FileOutputStream(file));
    } catch (FileNotFoundException e1) {
        e1.printStackTrace();
    } catch (DocumentException e1) {
        e1.printStackTrace();
    }

    return document;
}

然后我添加一些段落。这些段落的长度各不相同。当我超过页面的长度时,IText会添加另一页。页数为62 x 75 mm。

我想根据文字数量改变长度,所以我不会浪费纸张。我试过这个:

try {
    PdfReader reader = new PdfReader(MainActivity.FILE_URI);

    while (reader.getNumberOfPages() > 1) {
        float pageHeight = document.getPageSize().getHeight();
        float pageWidth = document.getPageSize().getWidth();

        pageHeight += 50f;

        document.setPageSize(new Rectangle(pageWidth, pageHeight));
    }
} catch (IOException e) {
    e.printStackTrace();
}

但它不起作用。页面不会越来越长,因此页面数保持不变并导致循环。

任何人都知道解决方案吗?

1 个答案:

答案 0 :(得分:1)

基本上你需要首先画一个很长的页面,比你用例的任何合理输入更长,然后切掉较低的空白部分。

这意味着您必须首先相应地设置pageHeight值。安全值是

float pageHeight = 14400f;

您现在获得的结果是一个PDF文档,其中包含一个非常长的页面,长度超过5米。

此页面必须缩短以匹配内容。这可以在第二次传递中完成(我使用您已经定义的pageSize矩形; INTERMEDIATE指向您在第一次传递中生成的PDF):

PdfReader reader = new PdfReader(INTERMEDIATE);
PdfStamper stamper = new PdfStamper(reader, FINAL_RESULT);

PdfReaderContentParser parser = new PdfReaderContentParser(reader);
TextMarginFinder finder = parser.processContent(1, new TextMarginFinder());

PdfDictionary page = reader.getPageN(1);
page.put(PdfName.CROPBOX, new PdfArray(new float[]{pageSize.getLeft(), finder.getLly(), pageSize.getRight(), pageSize.getTop()}));
stamper.markUsed(page);

stamper.close();
reader.close();

根据您的文档数据,您可以使用ByteArrayOutputStream PdfWriterbyte[]保留中间PDF,并在document.close()之后将{intermdeiate PDF检索为byte[],并且在第二步中将PdfReader提供给{{1}}。