PDF缩放/导入已修剪页/裁剪(PDF scaling/importing pages that h

2019-10-18 13:47发布

目前我在写一个应用程序,“格式” PDF对我们的要求,利用iText 2.1.7的过程。

我们基本上采取的肖像PDF和缩小页面,所以我们可以配合2页的原始PDF,新PDF的一个横向页面。 我们还在其中用于后处理的页面的底部留有一定的空间。

这个过程的工作90%的时间,因为它应该。

但是,我们收到的已冒出一个PDF /由内容系修整,当我们在Acrobat查看该PDF,它看起来excpected。 然而,当我们处理它,新的PDF包含完整的原始媒体框和裁切线。

下面是我们使用的代码和问题输出的外观。

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内容:

Answer 1:

虽然很难没有看到PDF本身可以肯定的,我怀疑你的问题是,这种PDF指定CropBox上至少它的一些网页。 如果是这样的话,那么我认为你会想这样做page.setBoundingBox(reader.getCropBox(i)); 之后你的权利得到页面引用。

需要注意的是一个网页的默认值CropBox是它的MediaBox ,所以除上述线路的不应该是没有指定的PDF页面的布局产生负面影响CropBox

(我不是一个iText的用户,所以这是对我而言有点炒作......)

祝好运!



Answer 2:

很多的挫折后,我终于得到这个工作,通过“硬裁剪”做我的缩放和布局处理之前的PDF。

硬裁剪的需要裁剪的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();
    }
}


Answer 3:

一个微小但重要的修复程序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()));
            ...


文章来源: PDF scaling/importing pages that have been trimmed/cropped