我正在使用标签打印机打印我的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();
}
但它不起作用。页面不会越来越长,因此页面数保持不变并导致循环。
任何人都知道解决方案吗?
答案 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
PdfWriter
为byte[]
保留中间PDF,并在document.close()
之后将{intermdeiate PDF检索为byte[]
,并且在第二步中将PdfReader
提供给{{1}}。