iTextpdf,
我的目标是将 PDF 与不同大小和不同方向/旋转的页面合并,将它们全部放在 A4 页面上。
我创建的代码可以纵向合并和旋转页面,但无法缩放内容以适应 A4 页面。
我编写了另一个例程(使用 itext.kernel),但它引发了一个我无法解决的异常(未找到 CMap com/itextpdf/io/font/cmap/UniJIS-UTF16-H)。
谁能帮我用这段代码来缩放 A4 内的内容?
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.12</version>
</dependency>
public byte[] gerarPDF() throws IOException, DocumentException {
Document document = new Document(); // PageSize.A4
//document.setPageSize(PageSize.A4);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PdfCopy writer = new PdfCopy(document, outputStream);
document.open();
InputStream inputStream = new FileInputStream("document_46.pdf");
PdfReader reader = new PdfReader(inputStream);;
PdfImportedPage pdfImportedPage;
PdfDictionary pageDict;
int rotation; int i = 1;
while ( i <= reader.getNumberOfPages() ) {
pdfImportedPage = writer.getImportedPage(reader, i);
rotation = reader.getPageRotation(i);
pageDict = reader.getPageN(i);
// ROTACAO E ORIENTACAO DAS PAGINAS
// Página em Paisagem, quando a largura é maior que a altura
// rotaciona para posição em Retrato
if (pdfImportedPage.getWidth() > pdfImportedPage.getHeight()) {
pageDict.put(PdfName.ROTATE, new PdfNumber(rotation + 90));
}
// Página com a rotação em 90º - voltar para posição em Retrato
if (rotation == 90) {
pageDict.put(PdfName.ROTATE, new PdfNumber(rotation - 90));
}
// SCALE DAS PAGINAS
// float widthPage = pdfImportedPage.getWidth();
// float heightPage = pdfImportedPage.getHeight();
//
// if( widthPage > heightPage ){
// pageDict.put(PdfName.MEDIABOX, new PdfRectangle(841.92f,595.32f));
//
// }else if( widthPage > 595.33 && widthPage < 612.51 ) {
// pageDict.put(PdfName.MEDIABOX, new PdfRectangle(595.32f, 841.92f));
//
// }else if( widthPage > 612.51 ) {
// pageDict.put(PdfName.MEDIABOX, new PdfRectangle(595.32f, 841.92f));
//
// }else{
// pageDict.put(PdfName.MEDIABOX, new PdfRectangle(595.32f, 841.92f));
// }
pageDict.put(PdfName.MEDIABOX, new PdfRectangle(595.32f, 841.92f));
PdfCopy.PageStamp stamp = writer.createPageStamp(pdfImportedPage);
Chunk chunk = new Chunk(String.format("Página %d", i));
Font font = new Font();
font.setFamily(Font.FontFamily.HELVETICA.name());
font.setSize(8);
font.setStyle(Font.FontStyle.ITALIC.getValue());
chunk.setFont(font);
ColumnText.showTextAligned(stamp.getUnderContent(), PdfContentByte.ALIGN_CENTER,
new Phrase(chunk), 520, 20, 0);
stamp.alterContents();
writer.addPage(pdfImportedPage);
i++;
}
outputStream.flush();
document.close();
outputStream.close();
return outputStream.toByteArray();
}
用这条线我可以把所有的页面都变成A4大小。好的
pageDict.put(PdfName.MEDIABOX, new PdfRectangle(595.32f, 841.92f));
现在剩下的就是缩放内容以适应 A4。