【问题标题】:itext Split PDF Verticallyitext 垂直拆分 PDF
【发布时间】:2015-09-08 09:00:31
【问题描述】:

我有一个要求,我必须在垂直中心垂直分割 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();
            }   
        }   
    }

【问题讨论】:

  • 原来的要求是在中心垂直分割单页,并将LHS复制到第一页,将RHS复制到第二页并保存到输出文件。
  • PdfCopy 用于将页面原样复制到新的 PDF,即最常见的 PDF 合并用例。因此,您预先设置的裁剪框将被忽略。
  • 是否有工作代码来完成拆分?
  • 通过在中心垂直分割一个PDF页面你的意思是沿着一条垂直线分割,即分成左半部分和右半部分?或者你的意思是垂直范围必须被分割,即分成下半部分和上半部分?页面轮换是否重要?
  • 我的意思是将一页分成两半,LHS 应该是第一页,RHS 应该是第二页。输入的 PDF 可能包含超过 1 页,并且所有页面都应该发生相同的情况,我需要如前所述,新的 PDF 页面已重新排列。

标签: pdf split itext


【解决方案1】:

您可以使用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();
    }
}

(SplitIntoHalfPages.java)

此方法创建包含每个页面的源文档的副本两次,一次是 CropBox 限制在左半页,一次是在右半页。

注意:此方法仅拆分页面内容。如果您的源 PDF 有注释,您可能还需要处理它们。

【讨论】:

  • 非常感谢 mkl,您的代码完美地分成两部分并按照我的意愿将它们重新连接起来,我的输入文件中只有内容,因此注释和其他嵌入对象无关紧要我。
  • @mkl 关于如何在这种情况下处理注释和其他嵌入对象有什么想法吗?
  • @Shiran 关于注释,我首先会尝试像上面的 CropBox 那样操作 pageNAnnots 数组,即首先检索原始页面的注释并创建两个数组,每个半页一个仅包含该半页的注释,然后在添加每个半页之前相应地替换 pageN Annots 条目。如果这不起作用(我还没有尝试过),我会尝试使用 PdfReader/PdfStamper 对对生成的 PDF 进行后处理并删除页外注释。关于其他嵌入对象 - 你是什么意思?
  • @mkl。能否请您提供一个如何做到这一点的示例。
  • @ShiranSEkanayake 请自行提出堆栈溢出问题,您在其中 (A) 还为您的测试要求提供代表 PDF,( B) 定义如何处理部分出现在两个半页上的注释,并(C) 解释您所说的“其他嵌入对象” 的含义.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 2018-12-27
  • 2017-09-30
  • 2020-03-20
相关资源
最近更新 更多