我正在尝试创建合并三个pdf的java应用程序。前两个pdf我结合了普通格式而无需调整大小和旋转。我要旋转最后一个pdf,并将两个pdf页面放入一个pdf页面。
我使用了iText 5.5.13。我尝试合并两个pdf文件,并且效果很好。
public void mergePdf(List<File> pdfFiles, File outputFile) {
try {
Document document = new Document();
FileOutputStream outputStream = new FileOutputStream(outputFile);
PdfCopy copy = new PdfSmartCopy(document, outputStream);
document.open();
for (File inFile : pdfFiles) {
PdfReader reader = new PdfReader(inFile.getAbsolutePath());
copy.addDocument(reader);
reader.close();
}
document.close();
} catch (DocumentException | IOException ex) {
ex.printStackTrace();
}
}
我不知道如何与旋转合并并将两页调整为一个pdf页。
答案 0 :(得分:2)
合并:
public void mergeTwoPagesIntoOne(String originalPdfFile, String outputPdfFile) throws IOException, DocumentException {
PdfReader reader = new PdfReader(originalPdfFile);
Document doc = new Document(new RectangleReadOnly(842f, 595f), 0, 0, 0, 0);
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(outputPdfFile));
doc.open();
int totalPages = reader.getNumberOfPages();
for (int i = 1; i <= totalPages; i = i + 2) {
doc.newPage();
PdfContentByte cb = writer.getDirectContent();
PdfImportedPage page = writer.getImportedPage(reader, i); // page #1
float documentWidth = doc.getPageSize().getWidth() / 2;
float documentHeight = doc.getPageSize().getHeight();
if (i > 1)
documentHeight = documentHeight - 50f;
float pageWidth = page.getWidth();
float pageHeight = page.getHeight();
float widthScale = documentWidth / pageWidth;
float heightScale = documentHeight / pageHeight;
float scale = Math.min(widthScale, heightScale);
float offsetX = (documentWidth - (pageWidth * scale)) / 2;
float offsetY = 0f;
cb.addTemplate(page, scale, 0, 0, scale, offsetX, offsetY);
if (i+1 <= totalPages) {
PdfImportedPage page2 = writer.getImportedPage(reader, i+1); // page #2
pageWidth = page.getWidth();
pageHeight = page.getHeight();
widthScale = documentWidth / pageWidth;
heightScale = documentHeight / pageHeight;
scale = Math.min(widthScale, heightScale);
offsetX = ((documentWidth - (pageWidth * scale)) / 2) + documentWidth;
cb.addTemplate(page2, scale, 0, 0, scale, offsetX, offsetY);
}
}
doc.close();
}
旋转:
public void rotatePdf(String originalPdfFile, String outputPdfFile, int degrees) throws IOException, DocumentException {
PdfReader reader = new PdfReader(originalPdfFile);
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
PdfDictionary dictionary = reader.getPageN(i);
dictionary.put(PdfName.ROTATE, new PdfNumber(degrees));
}
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputPdfFile));
stamper.close();
reader.close();
}
答案 1 :(得分:2)
通常,您希望将每个页面变成一个XObject(@mflorczak的答案中的PdfImportedPage),然后将其中两个绘制到一个页面中。
如果您事先知道所有页面的大小和形状都相同,那么您就可以预先确定并以硬编码方式显示它们了。如果没有,则需要能够以一般方式处理可能存在的VAST数量的组合。
这称为“ N-up”打印,如果您想了解更多信息,那么互联网上已有很多关于它的文章。您的特定示例是“两联”打印。
PdfImportedPage
个PdfContentByte
上以所需的对齐和旋转方式绘制导入的页面。您可能想像@mflorczak的答案中所提供的那样,对比例和偏移(可能还有旋转)进行实验,以上一般理论应有助于指导您。 PdfImportedPage
应该使您免受源页面旋转的影响,因此您只需要考虑它们的效果边界即可。