iText Java - 缩放不同大小的页面。返回一些 PDF 的错误

问题描述 投票:0回答:0

我需要你的帮助。

我正在使用您的代码来缩放 PDF 中的页面,使它们保持相同大小并且内容适合 A4。

代码运行并达到目的,但使用特定 PDF 编译抛出此异常。

找不到CMap com/itextpdf/io/font/cmap/UniJIS-UTF16-H

public byte[] gerarPDFViaGet() throws IOException {
    
            ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    
            com.itextpdf.kernel.pdf.PdfDocument mergedPdf = new com.itextpdf.kernel.pdf.PdfDocument(
                    new com.itextpdf.kernel.pdf.PdfWriter(outputStream) );
    
            com.itextpdf.kernel.geom.Rectangle pageSize = com.itextpdf.kernel.geom.PageSize.A4;
            com.itextpdf.kernel.geom.Rectangle pageBodySize = pageSize.clone()
                    .applyMargins(10, 10, 10, 10, false);
    
            InputStream resource = new FileInputStream("document_78.pdf");
            com.itextpdf.kernel.pdf.PdfReader pdfReader = new com.itextpdf.kernel.pdf.PdfReader(resource);
            com.itextpdf.kernel.pdf.PdfDocument pdfDocument = new com.itextpdf.kernel.pdf.PdfDocument(pdfReader);
    
            pdfDocument.copyPagesTo(1, pdfDocument.getNumberOfPages(), mergedPdf, new PdfPageFormCopier());
            scale(mergedPdf, pageSize, pageBodySize);
    
            mergedPdf.close();
    
            return outputStream.toByteArray();
    
        }

规模。

void scale(com.itextpdf.kernel.pdf.PdfDocument pdfDocument, com.itextpdf.kernel.geom.Rectangle pageSize,
                   com.itextpdf.kernel.geom.Rectangle pageBodySize) {
    
            for (int i = 1; i <= pdfDocument.getNumberOfPages(); i++) {
                com.itextpdf.kernel.pdf.PdfPage page = pdfDocument.getPage(i);
    
                // ROTACAO E ORIENTACAO DAS PAGINAS
                if( page.getPageSizeWithRotation().getWidth() > page.getPageSizeWithRotation().getHeight() )
                    pdfDocument.getPage(i).put(com.itextpdf.kernel.pdf.PdfName.Rotate,PORTRAIT);
    
                if ( page.getRotation() == 90 )
                    pdfDocument.getPage(i).put(com.itextpdf.kernel.pdf.PdfName.Rotate,PORTRAIT);
    
                MarginFinder marginFinder = new MarginFinder();
                com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor pdfCanvasProcessor = new com.itextpdf.kernel
                        .pdf.canvas.parser.PdfCanvasProcessor(marginFinder);
                pdfCanvasProcessor.processPageContent(page);
                com.itextpdf.kernel.geom.Rectangle boundingBox = marginFinder.getBoundingBox();
                if (boundingBox == null || boundingBox.getWidth() == 0 || boundingBox.getHeight() == 0) {
                    System.err.printf("Não é possível dimensionar o conteúdo da página %d com a caixa delimitadora %s\n",
                            i , boundingBox);
                    continue;
                } else {
    
                    List<Double> retornoScales = calcularFatorScale(pageBodySize,boundingBox);
                    double scale = retornoScales.get(0);
                    double xDiff = retornoScales.get(1);
                    double yDiff = retornoScales.get(2);
    
                    if( scale > 0.5 ){
    
                            com.itextpdf.kernel.geom.AffineTransform transform = com.itextpdf.kernel.geom.AffineTransform
                                    .getTranslateInstance(pageBodySize.getLeft() + xDiff, pageBodySize.getBottom() + yDiff);
                            transform.scale(scale, scale);
                            transform.translate(-boundingBox.getLeft(), -boundingBox.getBottom());
                            new com.itextpdf.kernel.pdf.canvas.PdfCanvas(page.newContentStreamBefore(), page.getResources(), pdfDocument)
                                    .concatMatrix(transform);
                    }
                }
                page.setMediaBox(pageSize);
                page.setCropBox(pageSize);
            }
        }

FatorScale.

public List<Double> calcularFatorScale(com.itextpdf.kernel.geom.Rectangle pageBodySize,
                                               com.itextpdf.kernel.geom.Rectangle boundingBox){
    
            List<Double> retornoScales = new ArrayList<>();
            double scale = 0, xDiff= 0, yDiff = 0;
    
            double xScale = pageBodySize.getWidth()/boundingBox.getWidth();
            double yScale = pageBodySize.getHeight()/boundingBox.getHeight();
            if (xScale < yScale) {
                yDiff = boundingBox.getHeight() * (yScale / xScale - 1) / 2;
                scale = xScale;
            } else {
                xDiff = boundingBox.getWidth() * (xScale / yScale - 1) / 2;
                scale = yScale;
            }
    
            retornoScales.add(scale);
            retornoScales.add(xDiff);
            retornoScales.add(yDiff);
    
            return retornoScales;
        }

一些示例 PDF 返回您所期望的。但其他人返回异常: CMap com/itextpdf/io/font/cmap/UniJIS-UTF16-H 找不到。

两个示例 PDF 用于输入。其中之一返回此异常;

java itext
© www.soinside.com 2019 - 2024. All rights reserved.