itext 垂直拆分 PDF
itext Split PDF Vertically
我有一个要求,我必须在中间垂直分割 PDF 页面。
我搜索了各种帖子,无法找到正确的方法
我想使用 Java 的 iText 库。
我使用了
中的 SplitPDFFile.java
iText: split a PDF into several PDF (1 per page)
并像下面那样修改它,但页面没有拆分,而是复制了整个页面。
import java.io.FileOutputStream;
import com.itextpdf.text.Document;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
public class SplitPDFFile {
/**
* @param args
*/
public static void main(String[] args) {
try {
String inFile = "C:/input.pdf";
System.out.println ("Reading " + inFile);
PdfReader reader = new PdfReader(inFile);
Rectangle cropBox = reader.getCropBox(1);
Rectangle psize = reader.getPageSize(1);
cropBox.setRight(psize.getWidth()/2);
System.out.println(psize.getWidth());
System.out.println(psize.getHeight());
int n = reader.getNumberOfPages();
System.out.println ("Number of pages : " + n);
int i = 0;
while ( i < n ) {
String outFile = inFile.substring(0, inFile.indexOf(".pdf"))
+ "-" + String.format("%03d", i + 1) + ".pdf";
System.out.println ("Writing " + outFile);
Document document = new Document(cropBox);
PdfCopy writer = new PdfCopy(document, new FileOutputStream(outFile));
writer.setCropBoxSize(cropBox);
document.open();
PdfImportedPage page = writer.getImportedPage(reader, ++i);
writer.addPage(page);
document.close();
writer.close();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
您可以使用 PdfCopy
尝试此方法,间歇性地操作从以下位置复制的 PdfReader
:
void splitIntoHalfPages(InputStream source, File target) throws IOException, DocumentException
{
final PdfReader reader = new PdfReader(source);
try ( OutputStream targetStream = new FileOutputStream(target) )
{
Document document = new Document();
PdfCopy copy = new PdfCopy(document, targetStream);
document.open();
for (int page = 1; page <= reader.getNumberOfPages(); page++)
{
PdfDictionary pageN = reader.getPageN(page);
Rectangle cropBox = reader.getCropBox(page);
PdfArray leftBox = new PdfArray(new float[]{cropBox.getLeft(), cropBox.getBottom(), (cropBox.getLeft() + cropBox.getRight()) / 2.0f, cropBox.getTop()});
PdfArray rightBox = new PdfArray(new float[]{(cropBox.getLeft() + cropBox.getRight()) / 2.0f, cropBox.getBottom(), cropBox.getRight(), cropBox.getTop()});
PdfImportedPage importedPage = copy.getImportedPage(reader, page);
pageN.put(PdfName.CROPBOX, leftBox);
copy.addPage(importedPage);
pageN.put(PdfName.CROPBOX, rightBox);
copy.addPage(importedPage);
}
document.close();
}
finally
{
reader.close();
}
}
此方法创建包含每个页面两次的源文档副本,一次使用 CropBox 限制在左半页,一次在右半页。
注意: 此方法仅拆分页面 content。如果您的源 PDF 有 注释,您可能还想处理它们。
我有一个要求,我必须在中间垂直分割 PDF 页面。 我搜索了各种帖子,无法找到正确的方法
我想使用 Java 的 iText 库。
我使用了
中的 SplitPDFFile.javaiText: split a PDF into several PDF (1 per page)
并像下面那样修改它,但页面没有拆分,而是复制了整个页面。
import java.io.FileOutputStream;
import com.itextpdf.text.Document;
import com.itextpdf.text.Rectangle;
import com.itextpdf.text.pdf.PdfCopy;
import com.itextpdf.text.pdf.PdfImportedPage;
import com.itextpdf.text.pdf.PdfReader;
public class SplitPDFFile {
/**
* @param args
*/
public static void main(String[] args) {
try {
String inFile = "C:/input.pdf";
System.out.println ("Reading " + inFile);
PdfReader reader = new PdfReader(inFile);
Rectangle cropBox = reader.getCropBox(1);
Rectangle psize = reader.getPageSize(1);
cropBox.setRight(psize.getWidth()/2);
System.out.println(psize.getWidth());
System.out.println(psize.getHeight());
int n = reader.getNumberOfPages();
System.out.println ("Number of pages : " + n);
int i = 0;
while ( i < n ) {
String outFile = inFile.substring(0, inFile.indexOf(".pdf"))
+ "-" + String.format("%03d", i + 1) + ".pdf";
System.out.println ("Writing " + outFile);
Document document = new Document(cropBox);
PdfCopy writer = new PdfCopy(document, new FileOutputStream(outFile));
writer.setCropBoxSize(cropBox);
document.open();
PdfImportedPage page = writer.getImportedPage(reader, ++i);
writer.addPage(page);
document.close();
writer.close();
}
}
catch (Exception e) {
e.printStackTrace();
}
}
}
您可以使用 PdfCopy
尝试此方法,间歇性地操作从以下位置复制的 PdfReader
:
void splitIntoHalfPages(InputStream source, File target) throws IOException, DocumentException
{
final PdfReader reader = new PdfReader(source);
try ( OutputStream targetStream = new FileOutputStream(target) )
{
Document document = new Document();
PdfCopy copy = new PdfCopy(document, targetStream);
document.open();
for (int page = 1; page <= reader.getNumberOfPages(); page++)
{
PdfDictionary pageN = reader.getPageN(page);
Rectangle cropBox = reader.getCropBox(page);
PdfArray leftBox = new PdfArray(new float[]{cropBox.getLeft(), cropBox.getBottom(), (cropBox.getLeft() + cropBox.getRight()) / 2.0f, cropBox.getTop()});
PdfArray rightBox = new PdfArray(new float[]{(cropBox.getLeft() + cropBox.getRight()) / 2.0f, cropBox.getBottom(), cropBox.getRight(), cropBox.getTop()});
PdfImportedPage importedPage = copy.getImportedPage(reader, page);
pageN.put(PdfName.CROPBOX, leftBox);
copy.addPage(importedPage);
pageN.put(PdfName.CROPBOX, rightBox);
copy.addPage(importedPage);
}
document.close();
}
finally
{
reader.close();
}
}
此方法创建包含每个页面两次的源文档副本,一次使用 CropBox 限制在左半页,一次在右半页。
注意: 此方法仅拆分页面 content。如果您的源 PDF 有 注释,您可能还想处理它们。