我正在使用"pdfbox-app-2.0.0-RC2.jar"
我创建了一个类,它缩小了pdf内容,并在指定的坐标处创建了带有此内容的新pdf。
我的问题是,如果一个pdf文件被修改并添加了新内容,那么缩小后的文件中就会缺少这些内容。
以下是我的方法:
public static String scaleInputPdf(String sourceFileName, float xpos,
float ypos, float imgCtrlWidth, float imgCtrlHeight,
PDRectangle pageSize) throws IOException {
String workdir = "/tmp";
File tmpDir = new File(workdir);
if(! tmpDir.exists()) {
tmpDir.mkdir();
}
String destPath = workdir + "/Result.pdf";
PDDocument sourceDoc = null;
try {
// load the source PDF
sourceDoc = PDDocument.load(new File(sourceFileName));
// create a new PDF and add a blank page
PDDocument doc = new PDDocument();
for (int sourcePageNo = 0; sourcePageNo < sourceDoc
.getNumberOfPages(); sourcePageNo++) {
PDPage page = new PDPage();
page.setMediaBox(pageSize);
doc.addPage(page);
PDPage currentSourcePage = sourceDoc.getPage(sourcePageNo);
PDPageContentStream contents = new PDPageContentStream(doc,
page, true, true, true);
float scaleFactor = getScalingFactor(currentSourcePage,
imgCtrlWidth, imgCtrlHeight, pageSize);
PDFormXObject form = null;
// Create a Form XObject from the source document using
// LayerUtility
LayerUtility layerUtility = new LayerUtility(doc);
form = layerUtility.importPageAsForm(sourceDoc,
sourcePageNo);
// draw a scaled form
contents.saveGraphicsState();
Matrix scalingMatrix = Matrix.getScaleInstance(scaleFactor,
scaleFactor);
contents.transform(scalingMatrix);
Matrix translatingMatrix = Matrix.getTranslateInstance(
xpos,
getYPosition(currentSourcePage, pageSize, ypos,
scaleFactor));
contents.transform(translatingMatrix);
contents.drawForm(form);
contents.restoreGraphicsState();
contents.close();
}
doc.save(destPath);
doc.close();
} catch (IOException ioe) {
ioe.printStackTrace();
} finally {
if (sourceDoc != null) {
sourceDoc.close();
}
}
System.err.println("Done! /n file is at following location=" +destPath);
return destPath;
}
private static float getScalingFactor(PDPage sourcePage,
float imgCtrlWidth, float imgCtrlHeight, PDRectangle pageSize) {
PDRectangle imageSize = sourcePage.getMediaBox();
if (imageSize.getHeight() > 792) {
if (pageSize.equals(PDRectangle.LETTER)) {
imgCtrlWidth = 838.8f; // 932 * 0.90
imgCtrlHeight = 1018f; // 1132 *0.90
} else if (pageSize.equals(PDRectangle.A4)) {
imgCtrlWidth = 819f; // 910 * 0.90
imgCtrlHeight = 972f; // 1080 * 0.90
}
}
float scaleX = imgCtrlWidth / imageSize.getWidth();
float scaleY = imgCtrlHeight / imageSize.getHeight();
float scaleFactor = ((scaleX < scaleY) ? scaleX : scaleY);
if (imageSize.getHeight() > 792 && scaleFactor > 0.88) {
scaleFactor = 0.88f;
}
return scaleFactor;
}
private static float getYPosition(PDPage sourcePage,
PDRectangle finalDocPageSize, float yMarginPos, float scaleFactor) {
float yPos = yMarginPos;
float imgHeight = sourcePage.getMediaBox().getHeight();
PDRectangle cropBox = sourcePage.getCropBox();
if (imgHeight > 792) {
if (cropBox.getLowerLeftY() != 0) {
yPos = cropBox.getLowerLeftY() + 40;
}
} else {
yPos = (finalDocPageSize.getHeight() - (imgHeight * scaleFactor + yMarginPos));
}
return yPos;
}
}
添加了以下代码,以便在新页面上显示带有调整大小值的注释:
列表anotn=currentSourcePage。getAnnotations();
for(PDAnnotation an :anotn) {
PDRectangle rec = an.getRectangle();
PDRectangle currentSourcePageMBox = currentSourcePage.getMediaBox();
boolean isLandscape = currentSourcePageMBox.getWidth() > currentSourcePageMBox.getHeight();
if(isLandscape) {
rec.setLowerLeftY(((rec.getLowerLeftY()) * scaleFactor) + 180 + 2 * ypos);
rec.setUpperRightY(((rec.getUpperRightY()) * scaleFactor) + 180 + 2*ypos);
}
else {
rec.setLowerLeftY(((rec.getLowerLeftY()) * scaleFactor) + ypos);
rec.setUpperRightY(((rec.getUpperRightY()) * scaleFactor) + ypos);
}
rec.setLowerLeftX((rec.getLowerLeftX() + xpos) * scaleFactor);
rec.setUpperRightX((rec.getUpperRightX() + xpos ) * scaleFactor);
an.setRectangle(rec);
}
// get all annotations and set on the new page.
page.setAnnotations(currentSourcePage.getAnnotations());
我正在尝试一个用户界面3.5,所有组件都工作正常,除了selectonemenu,它不能正确渲染。 它的文本字段在选择任何下拉字段时不显示。 我不能发布图片,因为我没有那么多的声誉 代码 屏幕拍摄 我怎样才能解决这个问题?
Localhost很好,但上传到服务器时不工作 %pdf-1.3 1 0 obj<>Endobj2 0 obj<>Endobj3 0 obj<>>/Mediabox[0.000 0.000 595.280 841.890]>>Endobj4 0 obj<>stream x 2 300 p@&b m-l l,br b 5 jr k drr f b k endstream endobj 8 0 obj
问题内容: 我正在使用 JSF 2.1.8 实现Web应用程序,而 ui:include 标记存在问题。我有这个代码 该 navigationManagerSystem bean是JSF会话管理,在这一段代码首先呈现的,它应该是显示包括路径内容。如果我以这样的常量执行此操作,则包括这些工作,但是如果我将其放入变量中则不行,即使我已经看到变量在屏幕打印之前就保持了该值。我不知道它是否可以与包含/sy
我使用docx4j创建pdf文件,使用docx格式可以正确呈现语言环境,但使用pdf#替换为语言环境字符串。 在我看到的文件中 当使用docx4j创建PDF时,它只能使用可用的字体。这些字体有两种来源: - - 请注意,Word会自动执行字体替换。当您在Word中打开现有文档并选择特定字体的文本时,如果您的计算机上没有安装该字体或该字体没有嵌入到文档中,则您在屏幕上看到的实际字体将不是功能区中报告
问题内容: 由于某种原因,onPageFinished在WebView完成加载之前就触发了-我不知道为什么… 好的,看来这不是固定的。我认为加载页面时出现了竞争情况,但是无法获得可复制的行为。 我将网页的HTML内容存储在SQLite数据库中,以便离线查看。我使用以下命令将内容重新加载到WebView中: 似乎有时在加载WebView时,它会正确触发WebViewClient.onPageFini
我正在使用OpenApi和Swagger构建一些文档,但由于js错误,我无法对其进行测试。 我想定义一个将接受特定值的参数,因此我在属性中添加了。我在请求中定义参数,如下所示 开发工具