我目前正在编写一个应用程序,使用iText 2.1.7将PDF格式化为我们的要求。
我们基本上采用纵向PDF并缩小页面,因此我们可以在新PDF的一个横向页面上放置2页原始PDF。我们还在页面底部留出一些空间用于后期处理。
此过程可以在90%的时间内正常工作。
但是,我们收到了内容部门裁剪/裁剪过的PDF文件,当我们在Acrobat中查看此PDF文件时,它看起来就像是一样。但是,当我们处理它时,新PDF包括整个原始MediaBox和裁剪线。
以下是我们使用的代码,以及问题输出的外观。
File tempFile = new File(tempFilename);
PdfReader reader = new PdfReader(originalPdfFile);
Document doc = new Document(new RectangleReadOnly(842f, 595f), 0, 0, 0, 0);
PdfWriter writer = PdfWriter.getInstance(doc, new FileOutputStream(tempFile));
doc.open();
for (int i = 1; i < reader.getNumberOfPages(); i = i + 2) {
doc.newPage();
PdfContentByte cb = writer.getDirectContent();
PdfImportedPage page = writer.getImportedPage(reader, i); // page #1
float documentWidth = doc.getPageSize().getWidth() / 2;
float documentHeight = doc.getPageSize().getHeight() - 65f;
float pageWidth = page.getWidth();
float pageHeight = page.getHeight();
float widthScale = documentWidth / pageWidth;
float heightScale = documentHeight / pageHeight;
float scale = Math.min(widthScale, heightScale);
float offsetX = (documentWidth - (pageWidth * scale)) / 2;
float offsetY = 65f; //100f
cb.addTemplate(page, scale, 0, 0, scale, offsetX, offsetY);
PdfImportedPage page2 = writer.getImportedPage(reader, i+1); // page #2
pageWidth = page.getWidth();
pageHeight = page.getHeight();
widthScale = documentWidth / pageWidth;
heightScale = documentHeight / pageHeight;
scale = Math.min(widthScale, heightScale);
offsetX = ((documentWidth - (pageWidth * scale)) / 2) + documentWidth;
offsetY = 65f; //100f
cb.addTemplate(page2, scale, 0, 0, scale, offsetX, offsetY);//430f
}
doc.close();
原着的杂技演员:
在acrobat中修改,显示不需要的pretrim内容:
答案 0 :(得分:3)
虽然很难在没有看到PDF本身的情况下确定,但我怀疑您的问题是此PDF在至少某些页面上指定了CropBox
。如果是这种情况,那么我认为您希望在获得页面引用后立即执行page.setBoundingBox(reader.getCropBox(i));
之类的操作。
请注意,网页CropBox
的默认值是MediaBox
,因此添加上述行不会对未指定{{1}的PDF页面的布局产生负面影响}。
(我不是iText的用户,所以这对我来说有点猜测......)
祝你好运!答案 1 :(得分:1)
硬裁剪采用Acrobat裁剪PDF(裁剪=隐藏),并使用PdfStamper
创建一个仅包含裁剪框内内容的新PDF。
public String cropPdf(String pdfFilePath) throws DocumentException, IOException {
String filename = FilenameUtils.getBaseName(pdfFilePath) + "_cropped." + FilenameUtils.getExtension(pdfFilePath);
filename = FilenameUtils.concat(System.getProperty("java.io.tmpdir"), filename);
PdfReader reader = new PdfReader(pdfFilePath);
try {
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(filename));
try {
for (int i = 1; i <= reader.getNumberOfPages(); i++) {
PdfDictionary pdfDictionary = reader.getPageN(i);
PdfArray cropArray = new PdfArray();
Rectangle cropbox = reader.getCropBox(i);
cropArray.add(new PdfNumber(cropbox.getLeft()));
cropArray.add(new PdfNumber(cropbox.getBottom()));
cropArray.add(new PdfNumber(cropbox.getLeft() + cropbox.getWidth()));
cropArray.add(new PdfNumber(cropbox.getBottom() + cropbox.getHeight()));
pdfDictionary.put(PdfName.CROPBOX, cropArray);
pdfDictionary.put(PdfName.MEDIABOX, cropArray);
pdfDictionary.put(PdfName.TRIMBOX, cropArray);
pdfDictionary.put(PdfName.BLEEDBOX, cropArray);
}
return filename;
} finally {
stamper.close();
}
} finally {
reader.close();
}
}
答案 2 :(得分:1)
对Kabals的一个小但重要的修复回答:方框期望宽度/高度而不是坐标:
...
cropArray.add(new PdfNumber(cropbox.getLeft()));
cropArray.add(new PdfNumber(cropbox.getBottom()));
cropArray.add(new PdfNumber(cropbox.getWidth()));
cropArray.add(new PdfNumber(cropbox.getHeight()));
...