将 pdf 文档合并到单页 iText
Merge pdf documents into a single page iText
我正在尝试将多个 pdf 页面合并为一个 pdf 页面。
有很多 iText 示例展示了如何将 pdf 页面组合成一个文件,但我需要所有页面都适合一个页面(沿它们的方向缩小它们的宽度和高度)
String[] files = { MovieLinks1.RESULT, MovieHistory.RESULT };
// step 1
Document document = new Document();
// step 2
PdfCopy copy = new PdfCopy(document, new FileOutputStream(RESULT));
// step 3
document.open();
// step 4
PdfReader reader;
int n;
// loop over the documents you want to concatenate
for (int i = 0; i < files.length; i++) {
reader = new PdfReader(files[i]);
// loop over the pages in that document
n = reader.getNumberOfPages();
for (int page = 0; page < n; ) {
copy.addPage(copy.getImportedPage(reader, ++page));
}
copy.freeReader(reader);
reader.close();
}
// step 5
document.close();
编辑:
尝试了 here 中的这段代码,但它只是将 pdf 页面合并到 1 个文件中,我需要它们缩小到 1 个单页中
因为您不想复制页面作为新文档的单独页面(这是最常见的合并 pdf 文档 用例)但是 相反 希望 所有页面都适合一个页面(沿它们的方向缩小它们的宽度和高度 , code source you referenced 单独并不能满足您的需求:那里的代码侧重于常见用例。
您的用例更像是 n-up 用例。因此,您应该查看 n-up iText 示例。最明显的是NUpTool,其中的焦点代码是这样的:
public void manipulatePdf(String src, String dest, int pow)
throws IOException, DocumentException {
// reader for the src file
PdfReader reader = new PdfReader(src);
// initializations
Rectangle pageSize = reader.getPageSize(1);
Rectangle newSize = (pow % 2) == 0 ?
new Rectangle(pageSize.getWidth(), pageSize.getHeight()) :
new Rectangle(pageSize.getHeight(), pageSize.getWidth());
Rectangle unitSize = new Rectangle(pageSize.getWidth(), pageSize.getHeight());
for (int i = 0; i < pow; i++) {
unitSize = new Rectangle(unitSize.getHeight() / 2, unitSize.getWidth());
}
int n = (int)Math.pow(2, pow);
int r = (int)Math.pow(2, pow / 2);
int c = n / r;
// step 1
Document document = new Document(newSize, 0, 0, 0, 0);
// step 2
PdfWriter writer
= PdfWriter.getInstance(document, new FileOutputStream(String.format(dest, n)));
// step 3
document.open();
// step 4
PdfContentByte cb = writer.getDirectContent();
PdfImportedPage page;
Rectangle currentSize;
float offsetX, offsetY, factor;
int total = reader.getNumberOfPages();
for (int i = 0; i < total; ) {
if (i % n == 0) {
document.newPage();
}
currentSize = reader.getPageSize(++i);
factor = Math.min(
unitSize.getWidth() / currentSize.getWidth(),
unitSize.getHeight() / currentSize.getHeight());
offsetX = unitSize.getWidth() * ((i % n) % c)
+ (unitSize.getWidth() - (currentSize.getWidth() * factor)) / 2f;
offsetY = newSize.getHeight() - (unitSize.getHeight() * (((i % n) / c) + 1))
+ (unitSize.getHeight() - (currentSize.getHeight() * factor)) / 2f;
page = writer.getImportedPage(reader, i);
cb.addTemplate(page, factor, 0, 0, factor, offsetX, offsetY);
}
// step 5
document.close();
reader.close();
}
此方法将 PDF src 的页面排列在文档 dest 和 2 中pow
每个目标页面上的源页面。
因此,对于您的用例, 在将页面合并到一个文件中之后,您只需 post 处理该文件上面的例程使用 pow
的最小值,其中 2pow
不小于原始页数。
我正在尝试将多个 pdf 页面合并为一个 pdf 页面。 有很多 iText 示例展示了如何将 pdf 页面组合成一个文件,但我需要所有页面都适合一个页面(沿它们的方向缩小它们的宽度和高度)
String[] files = { MovieLinks1.RESULT, MovieHistory.RESULT };
// step 1
Document document = new Document();
// step 2
PdfCopy copy = new PdfCopy(document, new FileOutputStream(RESULT));
// step 3
document.open();
// step 4
PdfReader reader;
int n;
// loop over the documents you want to concatenate
for (int i = 0; i < files.length; i++) {
reader = new PdfReader(files[i]);
// loop over the pages in that document
n = reader.getNumberOfPages();
for (int page = 0; page < n; ) {
copy.addPage(copy.getImportedPage(reader, ++page));
}
copy.freeReader(reader);
reader.close();
}
// step 5
document.close();
编辑: 尝试了 here 中的这段代码,但它只是将 pdf 页面合并到 1 个文件中,我需要它们缩小到 1 个单页中
因为您不想复制页面作为新文档的单独页面(这是最常见的合并 pdf 文档 用例)但是 相反 希望 所有页面都适合一个页面(沿它们的方向缩小它们的宽度和高度 , code source you referenced 单独并不能满足您的需求:那里的代码侧重于常见用例。
您的用例更像是 n-up 用例。因此,您应该查看 n-up iText 示例。最明显的是NUpTool,其中的焦点代码是这样的:
public void manipulatePdf(String src, String dest, int pow)
throws IOException, DocumentException {
// reader for the src file
PdfReader reader = new PdfReader(src);
// initializations
Rectangle pageSize = reader.getPageSize(1);
Rectangle newSize = (pow % 2) == 0 ?
new Rectangle(pageSize.getWidth(), pageSize.getHeight()) :
new Rectangle(pageSize.getHeight(), pageSize.getWidth());
Rectangle unitSize = new Rectangle(pageSize.getWidth(), pageSize.getHeight());
for (int i = 0; i < pow; i++) {
unitSize = new Rectangle(unitSize.getHeight() / 2, unitSize.getWidth());
}
int n = (int)Math.pow(2, pow);
int r = (int)Math.pow(2, pow / 2);
int c = n / r;
// step 1
Document document = new Document(newSize, 0, 0, 0, 0);
// step 2
PdfWriter writer
= PdfWriter.getInstance(document, new FileOutputStream(String.format(dest, n)));
// step 3
document.open();
// step 4
PdfContentByte cb = writer.getDirectContent();
PdfImportedPage page;
Rectangle currentSize;
float offsetX, offsetY, factor;
int total = reader.getNumberOfPages();
for (int i = 0; i < total; ) {
if (i % n == 0) {
document.newPage();
}
currentSize = reader.getPageSize(++i);
factor = Math.min(
unitSize.getWidth() / currentSize.getWidth(),
unitSize.getHeight() / currentSize.getHeight());
offsetX = unitSize.getWidth() * ((i % n) % c)
+ (unitSize.getWidth() - (currentSize.getWidth() * factor)) / 2f;
offsetY = newSize.getHeight() - (unitSize.getHeight() * (((i % n) / c) + 1))
+ (unitSize.getHeight() - (currentSize.getHeight() * factor)) / 2f;
page = writer.getImportedPage(reader, i);
cb.addTemplate(page, factor, 0, 0, factor, offsetX, offsetY);
}
// step 5
document.close();
reader.close();
}
此方法将 PDF src 的页面排列在文档 dest 和 2 中pow
每个目标页面上的源页面。
因此,对于您的用例, 在将页面合并到一个文件中之后,您只需 post 处理该文件上面的例程使用 pow
的最小值,其中 2pow
不小于原始页数。