【发布时间】:2016-04-15 22:47:43
【问题描述】:
我想为现有的 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();
}
}
更新 这是我用来将 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 轴,然后将文件传递给另一个程序,该程序执行徽标添加内容。
感谢布鲁诺。 :)
【问题讨论】:
-
您说“我正在将 iText-2.1.4 与 Java 一起使用。”您的代码显示“import com.itextpdf.text”。这是一个矛盾。您的代码是 iText 5 代码。您不能将它与 iText 2.1.4 一起使用。你甚至不应该使用 iText 2.1.4。欲了解更多信息,请阅读Can iText 2.1.7 or earlier be used commercially?的答案
-
哦。糟糕的是,我同时放置了两个库,但对我使用的是哪个库感到困惑。更新了我的问题。它的itextpdf-5.5.8。感谢您的回复。对我的代码有什么建议或改进吗?
标签: java pdf-generation itext