使用 Java IText 为现有 PDF 文档设置新页面大小
Setting new page size to existing PDF document using Java 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" 减少到 11" 的代码。它工作正常。但是,它不会将宽度 8.26 增加到 8.5"
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" X 11.69"。 hava 程序将徽标添加到文件并将其保存到新文件中。
由于这种转换,新源文件的 X 轴不知何故被锁定,因此我的程序无法修改 x 轴。
因此,我首先移动了我的程序并且它成功了。我的程序首先修改 x 和 y 轴,然后将文件传递给另一个程序,该程序执行徽标添加内容。
在此感谢布鲁诺。 :)
您正在更改页面大小而不更改内容。
如果你想缩小内容,那么你需要更复杂的代码。参见 for an example. There's also an example in the official documentation: 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 吗?
我想为我现有的 PDF 文档设置新的页面大小而不裁剪内容。我正在编写以下代码,但它只是从底部裁剪我的 PDF 文件,导致内容丢失。
当前尺寸为 8.26" X 11.69",我需要将其调整为 8.5" X 11"。
我的代码只能将 11.59 转换为 11。尝试更改 8.26 但它不起作用。
任何人都可以帮忙吗?我正在使用带有 Java.
的 itextpdf-5.5.8import 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" 减少到 11" 的代码。它工作正常。但是,它不会将宽度 8.26 增加到 8.5"
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" X 11.69"。 hava 程序将徽标添加到文件并将其保存到新文件中。
由于这种转换,新源文件的 X 轴不知何故被锁定,因此我的程序无法修改 x 轴。
因此,我首先移动了我的程序并且它成功了。我的程序首先修改 x 和 y 轴,然后将文件传递给另一个程序,该程序执行徽标添加内容。
在此感谢布鲁诺。 :)
您正在更改页面大小而不更改内容。
如果你想缩小内容,那么你需要更复杂的代码。参见
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 吗?