Java PDF缩放/导入已修剪/裁剪的页面

Java PDF缩放/导入已修剪/裁剪的页面,java,pdf,pdf-generation,itext,Java,Pdf,Pdf Generation,Itext,我目前正在编写一个应用程序,使用iText 2.1.7根据我们的要求“格式化”PDF 我们基本上采取了一个肖像PDF,并缩小了网页,所以我们可以适应2页的原始PDF,在一个新的PDF横向页面。我们还在页面底部留下一些空间,用于后期处理 这一过程在90%的时间内正常工作 然而,我们收到了一份由内容部裁剪/裁剪的PDF,当我们在Acrobat中查看此PDF时,它看起来是例外。但是,当我们处理它时,新的PDF包含整个原始MediaBox和裁剪行 下面是我们使用的代码,以及问题输出的外观 File te

我目前正在编写一个应用程序,使用iText 2.1.7根据我们的要求“格式化”PDF

我们基本上采取了一个肖像PDF,并缩小了网页,所以我们可以适应2页的原始PDF,在一个新的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();
File tempFile=新文件(tempFilename);
PdfReader reader=新PdfReader(原始PdfReader文件);
文档文档=新文档(新矩形只读(842f,595f),0,0,0,0);
PdfWriter writer=PdfWriter.getInstance(doc,新文件输出流(tempFile));
doc.open();
for(int i=1;i
acrobat原版:

在acrobat中修改,显示不需要的pretrim内容:


虽然在没有看到PDF本身的情况下很难确定,但我怀疑您的问题是,该PDF至少在某些页面上指定了一个
CropBox
。如果是这样的话,那么我认为您应该做一些类似于
page.setBoundingBox(reader.getCropBox(I))在获取页面引用后立即执行

请注意,页面的
CropBox
的默认值是它的
MediaBox
,因此添加上述行不会对未指定
CropBox
的PDF页面的布局产生负面影响

(我不是iText用户,所以这是我的一点推测…)


祝你好运

虽然在没有看到PDF本身的情况下很难确定,但我怀疑您的问题是,该PDF至少在其某些页面上指定了
CropBox
。如果是这样的话,那么我认为您应该做一些类似于
page.setBoundingBox(reader.getCropBox(I))在获取页面引用后立即执行

请注意,页面的
CropBox
的默认值是它的
MediaBox
,因此添加上述行不会对未指定
CropBox
的PDF页面的布局产生负面影响

(我不是iText用户,所以这是我的一点推测…)


祝你好运

在经历了很多挫折之后,我终于实现了这一点,在进行缩放和布局处理之前,我对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();
    }
}
publicstringcropdf(stringpdffilepath)抛出DocumentException,IOException{
字符串文件名=FilenameUtils.getBaseName(PdfilePath)+“_crapped.”+FilenameUtils.getExtension(PdfilePath);
filename=FilenameUtils.concat(System.getProperty(“java.io.tmpdir”),filename;
PdfReader reader=新的PdfReader(pdfFilePath);
试一试{
PdfStamper stamper=新PdfStamper(读取器,新文件输出流(文件名));
试一试{

对于(inti=1;i在经历了很多挫折之后,我终于实现了这一点,在进行缩放和布局处理之前对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();
    }
}
publicstringcropdf(stringpdffilepath)抛出DocumentException,IOException{
字符串文件名=FilenameUtils.getBaseName(PdfilePath)+“_crapped.”+FilenameUtils.getExtension(PdfilePath);
filename=FilenameUtils.concat(System.getProperty(“java.io.tmpdir”),filename;
PdfReader reader=新的PdfReader(pdfFilePath);
试一试{
PdfStamper stamper=新PdfStamper(读取器,新文件输出流(文件名));
试一试{

对于(int i=1;iKabals的一个次要但重要的修正回答:框期望的是宽度/高度,而不是坐标:

            ...
            cropArray.add(new PdfNumber(cropbox.getLeft()));
            cropArray.add(new PdfNumber(cropbox.getBottom()));
            cropArray.add(new PdfNumber(cropbox.getWidth()));
            cropArray.add(new PdfNumber(cropbox.getHeight()));
            ...

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