使用 pdfbox Java 在中间位置绘制图像
Draw image at mid position using pdfbox Java
我正在尝试使用 pdfbox 将图像添加到 pdf 的中心。下面是我的代码,但我无法在 pdf 中获得图像的正确位置。我按照以下 link 获得了正确的位置,但静止图像偏离中点位置?
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.util.Matrix;
public class imageAppend {
public static void main (String[] args){
File file = new File("...pdf file location");
PDDocument doc = null;
try
{
doc = PDDocument.load(file);
PDImageXObject pdImage = PDImageXObject.createFromFile("image file location", doc);
PDPage page = doc.getPage(0);
PDPageContentStream contentStream = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true);
float x_pos = page.getCropBox().getWidth();
float y_pos = page.getCropBox().getHeight();
float x_adjusted = ( x_pos - w ) / 2;
float y_adjusted = ( y_pos - h ) / 2;
Matrix mt = new Matrix(1f, 0f, 0f, -1f, page.getCropBox().getLowerLeftX(), page.getCropBox().getUpperRightY());
contentStream.transform(mt);
contentStream.drawImage(pdImage, x_adjusted, y_adjusted, w, h);
doc.save("new pdf file location");
doc.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
我用我的测试数据重现了你的问题(不幸的是你没有分享你的)我得到
修复很简单,我删除了这两行
Matrix mt = new Matrix(1f, 0f, 0f, -1f, page.getCropBox().getLowerLeftX(), page.getCropBox().getUpperRightY());
contentStream.transform(mt);
现在得到
对于一般情况,您还应该将裁剪框左下角的坐标添加到您的 x_adjusted
和 y_adjusted
float x_adjusted = ( x_pos - w ) / 2 + page.getCropBox().getLowerLeftX();
float y_adjusted = ( y_pos - h ) / 2 + page.getCropBox().getLowerLeftY();
(AddImage测试方法testImageAppendNoMirror
)
我正在尝试使用 pdfbox 将图像添加到 pdf 的中心。下面是我的代码,但我无法在 pdf 中获得图像的正确位置。我按照以下 link
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.util.Matrix;
public class imageAppend {
public static void main (String[] args){
File file = new File("...pdf file location");
PDDocument doc = null;
try
{
doc = PDDocument.load(file);
PDImageXObject pdImage = PDImageXObject.createFromFile("image file location", doc);
PDPage page = doc.getPage(0);
PDPageContentStream contentStream = new PDPageContentStream(doc, page, PDPageContentStream.AppendMode.APPEND, true);
float x_pos = page.getCropBox().getWidth();
float y_pos = page.getCropBox().getHeight();
float x_adjusted = ( x_pos - w ) / 2;
float y_adjusted = ( y_pos - h ) / 2;
Matrix mt = new Matrix(1f, 0f, 0f, -1f, page.getCropBox().getLowerLeftX(), page.getCropBox().getUpperRightY());
contentStream.transform(mt);
contentStream.drawImage(pdImage, x_adjusted, y_adjusted, w, h);
doc.save("new pdf file location");
doc.close();
} catch (IOException e)
{
e.printStackTrace();
}
}
}
我用我的测试数据重现了你的问题(不幸的是你没有分享你的)我得到
修复很简单,我删除了这两行
Matrix mt = new Matrix(1f, 0f, 0f, -1f, page.getCropBox().getLowerLeftX(), page.getCropBox().getUpperRightY());
contentStream.transform(mt);
现在得到
对于一般情况,您还应该将裁剪框左下角的坐标添加到您的 x_adjusted
和 y_adjusted
float x_adjusted = ( x_pos - w ) / 2 + page.getCropBox().getLowerLeftX();
float y_adjusted = ( y_pos - h ) / 2 + page.getCropBox().getLowerLeftY();
(AddImage测试方法testImageAppendNoMirror
)