【问题标题】:PDDocument can't add list of PDPage with addPage()PDDocument 无法使用 addPage() 添加 PDPage 列表
【发布时间】:2015-06-01 12:49:15
【问题描述】:

使用 1.8.9

我想使用裁剪工具将 PDF 页面剪切为多页 PDF。但是当我向我的 PDDocument 添加多个页面时,它根本不会添加它。

代码示例(原PDPage是我函数的参数):

private static void splitPage(int nbOfCrops, PDPage myPage) throws IOException{

PDDocument pdfSplit = new PDDocument();
ArrayList<PDPage> pages = new ArrayList<PDPage>();


    float croppingHeight = (myPage.findCropBox().getUpperRightY()/nbOfCrops);

    for(int page = 0; page<nbOfCrops; page++){
        pages.add(myPage); //Creates multiple copies of myPage
    }

    int splits = 0;
    for(PDPage page: pages){
        PDRectangle cropBox = page.findCropBox();
        PDRectangle rectangle = new PDRectangle();

        rectangle.setUpperRightY((float) (cropBox.getUpperRightY() - (croppingHeight* (splits))));
        rectangle.setLowerLeftY((float) (cropBox.getUpperRightY() - (croppingHeight*(splits+ 1))));
        rectangle.setUpperRightX(cropBox.getUpperRightX());
        rectangle.setLowerLeftX(cropBox.getLowerLeftX());
        page.setCropBox(rectangle);

        pdfSplit.addPage(page);

        splits++;
    }
    try {
        pdfSplit.save("test.pdf");   
        System.out.println(pdfSplit.getNumberOfPages()); //Always returns 1
        pdfSplit.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

那么,我应该怎么做/修改才能正确添加每个裁剪页面?

我的文件(如果你想看看我想做什么):

http://www.cinemas-utopia.org/admin/grilles/toulouse/2015-06-02.pdf

【问题讨论】:

  • 很难测试,因为你的代码不完整而且你没有告诉版本,但我没有看到你在做一个“新的 PDPage”,你总是添加相同的 PDPage 对象.这是故意的吗?
  • 刚刚编辑了一点。如果有 PDPage 对象的 ArrayList,我不需要实例化它们。 (也许我错了)。我复制页面 X 次以每次在不同的位置裁剪它并返回裁剪页面的列表。
  • 请尝试创建一个执行“新 PDPage”的软件,最坏的情况是您会浪费 10 分钟。我之所以提到它,是因为在 PDF 本身中,不同的页面是不同的对象。我不知道这是否是您探测的原因,但在最终的 PDF 中,它们必须不同,否则它们将具有相同的裁剪框。
  • @TilmanHausherr 感谢您的回答,我要做大事只是时间问题。

标签: java pdfbox


【解决方案1】:

我这样做了,对 PDF 进行了一些改进(特殊情况)。

    private static void cutAPDPage(int nbOfCrops, PDPage myPage, int resize) throws IOException{
    PDDocument pdfSplit = new PDDocument();
    ArrayList<PDPage> pages = new ArrayList<PDPage>();

    PDRectangle cropBox = myPage.findCropBox();
    PDRectangle newCropBox = new PDRectangle();
    newCropBox.setLowerLeftX(cropBox.getLowerLeftX());
    newCropBox.setLowerLeftY(cropBox.getLowerLeftY() - resize);
    newCropBox.setUpperRightX(cropBox.getUpperRightX());
    newCropBox.setUpperRightY(cropBox.getUpperRightY() + resize);
    myPage.setCropBox(newCropBox);


    PDRectangle mediaBox = myPage.findMediaBox();
    PDRectangle newMediaBox = new PDRectangle();
    newMediaBox.setLowerLeftX(mediaBox.getLowerLeftX());
    newMediaBox.setLowerLeftY(mediaBox.getLowerLeftY() - resize);
    newMediaBox.setUpperRightX(mediaBox.getUpperRightX());
    newMediaBox.setUpperRightY(mediaBox.getUpperRightY() + resize);
    myPage.setMediaBox(newMediaBox);

    float croppingHeight = (myPage.findCropBox().getUpperRightY()/nbOfCrops);

    for(int page = 0; page<nbOfCrops; page++){
        pages.add(new PDPage());
    }
    int splits = 0;
    for(PDPage page: pages){
        page = (PDPage) pdf.importPage(myPage);
        PDRectangle cropBox1 = page.findCropBox();
        PDRectangle rectangle = new PDRectangle();

        rectangle.setUpperRightY((float) (cropBox1.getUpperRightY() - (croppingHeight * (splits))));
        rectangle.setLowerLeftY((float) (cropBox1.getUpperRightY() - (croppingHeight*(splits + 1))));
        rectangle.setUpperRightX(cropBox1.getUpperRightX());
        rectangle.setLowerLeftX(cropBox1.getLowerLeftX());
        page.setCropBox(rectangle);

        pdfSplit.addPage(page);

        splits++;
    }
    try {
        pdfSplit.save("split.pdf");   
        pdfSplit.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

像魅力一样工作!

【讨论】:

    猜你喜欢
    • 2019-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-07
    • 2014-12-03
    相关资源
    最近更新 更多