当前位置: 首页 > 知识库问答 >
问题:

使用Java IText为现有PDF文档设置新页面大小

林祯
2023-03-14

我想为我现有的PDF文档设置一个新的页面大小,而不裁剪内容。我正在编写下面的代码,但它只是从底部裁剪我的PDF文件,导致内容丢失。

目前的尺寸是8.26“X 11.69”,我需要使它的8.5“X 11”。

我的代码只将11.59转换为11。试图更改8.26,但它不起作用。

有谁能帮忙吗?我将ITextPDF-5.5.8与Java一起使用。

import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.GrayColor;
import com.itextpdf.text.pdf.PdfArray;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfDictionary;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfNumber;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfRectangle;
import com.itextpdf.text.pdf.PdfStamper;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;



public class PageSize {

    public static final String SRC = "C:/Temp/BC.pdf";
    public static final String DEST = "C:/Temp/BC_New.pdf";

    public static void main(String[] args) throws IOException, DocumentException {
        File file = new File(DEST);
        file.getParentFile().mkdirs();
        new PageSize().manipulatePdf(SRC, DEST);
    }

    public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        int n = reader.getNumberOfPages();
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        // properties
        PdfContentByte over;
        PdfDictionary pageDict;
        PdfRectangle rect = new PdfRectangle(55, 76, 560, 816);
        PdfArray mediabox;
        float llx, lly, ury,llz;
        // loop over every page
        for (int i = 1; i <= n; i++) {
            pageDict = reader.getPageN(i);
            mediabox = pageDict.getAsArray(PdfName.MEDIABOX);
            llx = mediabox.getAsNumber(0).floatValue();
            lly = mediabox.getAsNumber(1).floatValue();
            llz = mediabox.getAsNumber(2).floatValue();
            ury = mediabox.getAsNumber(3).floatValue();
            mediabox.set(1, new PdfNumber((lly + 50)));
            over = stamper.getOverContent(i);
            over.saveState();
                       over.restoreState();
        }



        stamper.close();
        reader.close();
    }
}
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.GrayColor;
import com.itextpdf.text.pdf.PdfArray;
import com.itextpdf.text.pdf.PdfContentByte;
import com.itextpdf.text.pdf.PdfDictionary;
import com.itextpdf.text.pdf.PdfName;
import com.itextpdf.text.pdf.PdfNumber;
import com.itextpdf.text.pdf.PdfReader;
import com.itextpdf.text.pdf.PdfRectangle;
import com.itextpdf.text.pdf.PdfStamper;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;



public class PageSize {

    public static final String SRC = "C:/Temp/Test.pdf";
    public static final String DEST = "C:/Temp/BC_New.pdf";

    public static void main(String[] args) throws IOException, DocumentException {
        File file = new File(DEST);
        file.getParentFile().mkdirs();
        new PageSize().manipulatePdf(SRC, DEST);
    }

    public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
        PdfReader reader = new PdfReader(src);
        int n = reader.getNumberOfPages();
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
        // properties
        PdfContentByte over;
        PdfDictionary pageDict;
        PdfArray mediabox;
        float llx, lly, ury,llz;
        // loop over every page
        for (int i = 1; i <= n; i++) {
            pageDict = reader.getPageN(i);
            mediabox = pageDict.getAsArray(PdfName.MEDIABOX);
            llx = mediabox.getAsNumber(0).floatValue();
            lly = mediabox.getAsNumber(1).floatValue();
            ury = mediabox.getAsNumber(3).floatValue();
            mediabox.set(0, new PdfNumber((llx - 17)));
            mediabox.set(1, new PdfNumber((lly + 50)));
            over = stamper.getOverContent(i);
            over.saveState();
                       over.restoreState();
        }



        stamper.close();
        reader.close();
    }
}

谢谢布鲁诺。:)

共有1个答案

计燕七
2023-03-14

您正在更改页面大小而不更改内容。

如果您想缩小内容,那么您需要更复杂的代码。有关示例,请参见缩小pdf页面的内容。在官方文档中也有一个例子:如何在现有的PDF文件中收缩页面?

PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
int n = reader.getNumberOfPages();
PdfDictionary page;
PdfArray crop;
PdfArray media;
for (int p = 1; p <= n; p++) {
    page = reader.getPageN(p);
    media = page.getAsArray(PdfName.CROPBOX);
    if (media == null) {
        media = page.getAsArray(PdfName.MEDIABOX);
    }
    crop = new PdfArray();
    crop.add(new PdfNumber(0));
    crop.add(new PdfNumber(0));
    crop.add(new PdfNumber(media.getAsNumber(2).floatValue() / 2));
    crop.add(new PdfNumber(media.getAsNumber(3).floatValue() / 2));
    page.put(PdfName.MEDIABOX, crop);
    page.put(PdfName.CROPBOX, crop);
    stamper.getUnderContent(p).setLiteral("\nq 0.5 0 0 0.5 0 0 cm\nq\n");
    stamper.getOverContent(p).setLiteral("\nQ\nQ\n");
}
stamper.close();
reader.close();

如果您想要放大内容,那么您可以简单地更改UserUnit。更改用户单元在官方文档中也有解释:如何在现有PDF中旋转和缩放页面?

float factor = 2.5f;
PdfReader reader = new PdfReader(src);
int n = reader.getNumberOfPages();
PdfDictionary page;
for (int p = 1; p <= n; p++) {
    page = reader.getPageN(p);
    if (page.getAsNumber(PdfName.USERUNIT) == null)
        page.put(PdfName.USERUNIT, new PdfNumber(factor));
}
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest));
stamper.close();
reader.close();
    mediabox = pageDict.getAsArray(PdfName.MEDIABOX);
    llx = mediabox.getAsNumber(0).floatValue();
    lly = mediabox.getAsNumber(1).floatValue();
    ury = mediabox.getAsNumber(3).floatValue();
    mediabox.set(0, new PdfNumber((llx - 17)));
    mediabox.set(1, new PdfNumber((lly + 50)));
 类似资料:
  • 如何使用docx4j创建具有自定义页面大小的文档。我已经在网上搜索,并能够发现我们可以创建页面大小可用的PageSizePaper枚举仅...请帮助我创建自定义页面大小的文档。

  • 想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。 我有一个PDF文档,有两页。我需要阅读此文档的第一页,并使用阅读内容创建一个新的PDF文档。我将如何使用iText执行此操作?到目前为止,我无法尝试任何事情,因为我真的不知道如何开始。最好的方法是什么?

  • 问题内容: 在应用程序中,用户可以上传尺寸为8.46“ x 10.97”的任何pdf文件。根据我们的应用程序尺寸应为8.5“ x 11”。问题是,如何重新调整现有pdf页面的大小以设置8.5“ x11”?我必须通过代码修复,而不是手动,赞扬线路或外部软件。请让我知道提供此功能的Java支持jar(免费版)或通过简单的Java修复也可以。 问题答案: 使用iText,您可以执行以下操作: 我介绍了公

  • 问题内容: 如何使用PDFBox从PDF文档中读取特定页面(具有页码)? 问题答案: 这应该工作: 如本教程的“ 书签”部分中所示 更新2015年,版本2.0.0快照 似乎已将其删除并放回(?)。 getPage 在2.0.0 javadoc中。要使用它: 该 getAllPages 方法已更名 GETPAGES

  • 我在用iText7做游戏。净c#。我正在尝试在内存中创建一个多页PDF文档(n页数),其中源PDF文档只包含一页。 我可以用一页创建一个新文档,但无法根据需要创建额外的页面。我试过了 但我得到了一个ArgumentOutOfRange例外。。。索引超出范围。。。等 我试图关闭destPdfDoc,然后重新打开它,认为第二页直到我关闭它才被写入。但是当第二次打开destPdfDoc时,它没有页面。我

  • 问题内容: 我需要将pdf中的每个页面的大小从字母调整为合法大小。这是我到目前为止所得到的 即使调整大小正确,输出的pdf也只包含1页。有什么帮助吗? 问题答案: 这就是答案。我需要循环,请阅读我的原始问题的评论以获取更多信息