使用Java IText

时间:2016-04-14 10:07:28

标签: java pdf-generation itext

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

目前的规模为8.26" X 11.69"我需要把它变成8.5" X 11"。

我的代码只将11.59转换为11.尝试更改8.26但不是在调用。

任何人都可以帮忙吗?我正在使用带有Java的itextpdf-5.5.8。

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();
    }
}

已更新 这是我用来减少11.69&#34;至11&#34;。它工作正常。但是,它不会将宽度8.26增加到8.5&#34;

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();
    }
}

解决:

我试图修改的源文件存在问题。原始源文件是8.26&#34; X 11.69&#34;。 hava程序会在文件中添加徽标并将其保存到新文件中。

由于这种转换,新源文件的X轴被锁定,因此我的程序无法修改x轴。

因此,我将我的程序作为第一步移动并且有效。我的程序首先修改x和y轴,然后将文件传递给另一个执行徽标添加内容的程序。

感谢布鲁诺。 :)

1 个答案:

答案 0 :(得分:1)

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

如果要缩小内容,则需要更复杂的代码。有关示例,请参阅Shrinking the contents of a pdf page。官方文档中还有一个示例:How to shrink pages in an existing 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即可。更改UserUnit也在官方文档中进行了解释:How to rotate and scale pages in an existing 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();

此代码会将页面及其内容放大2.5倍(因为我们定义为factor)。

<强>更新

在您的更新中,您有:

    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)));

通过这样做,您在x方向(llx -17)添加0.236111英寸,并在y方向上减去0.69445英寸。如果你说这改变了11.69到11英寸,那么我假设你在谈论Y方向。如果X方向上的原始宽度最初为8.26,则应该是大约8.50。

我不明白你的问题。当然:我的计算假设您的文档中没有CropBox。是否有CropBox存在?