itext垂直拆分PDF

itext垂直拆分PDF,pdf,split,itext,Pdf,Split,Itext,我有一个要求,我必须分裂一个PDF页面的权利在中心垂直。 我翻遍了各种帖子,找不到正确的方法 我想使用Java使用iText库 我使用了来自的SplitPDFFile.java 并像下面那样修改了它,但页面没有被拆分,但它复制了整个页面 import java.io.FileOutputStream; import com.itextpdf.text.Document; import com.itextpdf.text.Rectangle; import com.itextpdf.text.

我有一个要求,我必须分裂一个PDF页面的权利在中心垂直。 我翻遍了各种帖子,找不到正确的方法

我想使用Java使用iText库

我使用了来自的SplitPDFFile.java

并像下面那样修改了它,但页面没有被拆分,但它复制了整个页面

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();
            }   
        }   
    }
import java.io.FileOutputStream;
导入com.itextpdf.text.Document;
导入com.itextpdf.text.Rectangle;
导入com.itextpdf.text.pdf.PdfCopy;
导入com.itextpdf.text.pdf.pdf导入页面;
导入com.itextpdf.text.pdf.PdfReader;
公共类SplitPDFFile{
/**
*@param args
*/
公共静态void main(字符串[]args){
试一试{
字符串infle=“C:/input.pdf”;
System.out.println(“读取”+infle);
PdfReader读取器=新PdfReader(填充);
矩形cropBox=reader.getCropBox(1);
矩形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(“页数:+n);
int i=0;
而(i
您可以使用
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();
    }
}
void splitinto半页(InputStream源、文件目标)引发IOException、DocumentException
{
最终PDF阅读器=新PDF阅读器(来源);
try(OutputStream targetStream=新文件OutputStream(目标))
{
文档=新文档();
PdfCopy copy=新的PdfCopy(文档,目标流);
document.open();

对于(int page=1;page最初的要求是在中间垂直拆分单个页面,将LHS复制到第一页,将RHS复制到第二页,并保存到输出文件。
PdfCopy
用于将页面复制到新的PDF,即最常见的PDF合并用例。因此,您事先设置的cropbox将被忽略。是否有工作g代码来完成拆分?通过将PDF页面从右中心垂直拆分,您是指沿垂直线拆分,即分为左半部分和右半部分?还是指必须将垂直范围拆分,即分为下半部分和上半部分?页面旋转是否重要?我指的是将一页拆分为两半,左半部分应为第一页RHS应该是第二页。输入PDF可能包含超过1页,并且所有页面都应该包含相同的内容,我需要新的PDF输出,并按照前面所述重新排列页面。非常感谢mkl,您的代码完美地分为两部分,并按照我的意愿重新连接,我的输入文件中只有内容,所以注释和其他内容嵌入对象与我无关。@mkl在这种情况下如何处理注释和其他嵌入对象有何想法?@Shiran关于注释,我将首先尝试操作
pageN
的Annots数组,就像上面的CropBox一样,即首先检索页面的原始注释并创建两个数组,一个用于每半页仅包含该半页的批注,然后在添加每半页之前相应地替换
pageN
Annots条目。如果不起作用(我还没有尝试过),我会尝试使用
PdfReader
/
PdfStamper
对生成的PDF进行后期处理,并删除页外注释。关于其他嵌入对象,你的意思是什么?@mkl。你能提供一个如何做的示例吗。@ShiranSEkanayake请将其本身作为堆栈溢出问题,其中您(A)还提供了一份有代表性的PDF,用于测试您的需求,(B)定义如何处理两个半页上部分出现的注释,以及(C)解释“其他嵌入对象”的含义。