我需要你的帮助。
我正在使用您的代码来缩放 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 用于输入。其中之一返回此异常;