如何将两个 pdf 页面合并和旋转到一页 itext
How merge and rotate two pdf pages to one page itext
我正在尝试创建 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。
合并:
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();
}
一般来说,您希望将每个页面都变成一个 XObject(@mflorczak 的回答中的 PdfImportedPage),并将其中两个绘制到一个页面中。
如果您事先知道所有页面的大小和形状都相同,那么您可以提前决定 hard-coding 您希望它们如何显示。如果没有,您需要能够以一般方式处理大量可能的组合。
这称为“N-up”打印,如果您想了解更多信息,互联网上有很多关于它的文章。您的具体示例是“2-up”打印。
- 获取要合并的页面的大小
- 在您的输出文档中创建一个足够容纳它们的新页面
- 创建
PdfImportedPage
个要导入的页面
- 在输出页面的
PdfContentByte
. 上绘制具有您想要的对齐和旋转的导入页面
- 转到 1
- 无法访问
- 盈利!
您可能想根据@mflorczak 的回答中提供的比例和偏移量(可能还有旋转)进行实验,上述一般理论应该有助于指导您。 PdfImportedPage
应该使您不受源页面轮换的影响,这样您只需要考虑它们的效果边界。
我正在尝试创建 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。
合并:
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();
}
一般来说,您希望将每个页面都变成一个 XObject(@mflorczak 的回答中的 PdfImportedPage),并将其中两个绘制到一个页面中。
如果您事先知道所有页面的大小和形状都相同,那么您可以提前决定 hard-coding 您希望它们如何显示。如果没有,您需要能够以一般方式处理大量可能的组合。
这称为“N-up”打印,如果您想了解更多信息,互联网上有很多关于它的文章。您的具体示例是“2-up”打印。
- 获取要合并的页面的大小
- 在您的输出文档中创建一个足够容纳它们的新页面
- 创建
PdfImportedPage
个要导入的页面 - 在输出页面的
PdfContentByte
. 上绘制具有您想要的对齐和旋转的导入页面
- 转到 1
- 无法访问
- 盈利!
您可能想根据@mflorczak 的回答中提供的比例和偏移量(可能还有旋转)进行实验,上述一般理论应该有助于指导您。 PdfImportedPage
应该使您不受源页面轮换的影响,这样您只需要考虑它们的效果边界。