Java 当写入PDF文件时,在图像上绘制的形状会反转
我有一个PDF文件,我转换成一个图像。我可以在图像顶部写字,但当我试图将形状/线条保存到pdf中时,点不是它们的位置,形状是颠倒的 这是我画的 这是保存的PDF文件。 我真的很抱歉,但这是我能做的最短代码,以复制问题 我知道这个问题不好,但我希望有人能帮助我 谢谢你的耐心Java 当写入PDF文件时,在图像上绘制的形状会反转,java,swing,pdf,pdfbox,Java,Swing,Pdf,Pdfbox,我有一个PDF文件,我转换成一个图像。我可以在图像顶部写字,但当我试图将形状/线条保存到pdf中时,点不是它们的位置,形状是颠倒的 这是我画的 这是保存的PDF文件。 我真的很抱歉,但这是我能做的最短代码,以复制问题 我知道这个问题不好,但我希望有人能帮助我 谢谢你的耐心 package pdfwriter; import java.awt.Dimension; import java.awt.Graphics; import java.awt.Graphics2D; import
package pdfwriter;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.AffineTransform;
import java.awt.geom.Line2D;
import java.awt.geom.NoninvertibleTransformException;
import java.awt.geom.Point2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.rendering.ImageType;
import org.apache.pdfbox.rendering.PDFRenderer;
public class Example {
private static class MyImagePanel extends JPanel {
final BufferedImage image;
final float scale = .38f;
AffineTransform atg;
Point start = new Point();
Point end = new Point();
boolean isNewLine = true;
static ArrayList<Line2D> lines = new ArrayList<>();
static PDDocument document;
public MyImagePanel() throws IOException {
document = PDDocument.load(new File("path"));
PDFRenderer renderer = new PDFRenderer(document);
image = renderer.renderImageWithDPI(0, 200, ImageType.RGB);
addMouseListener(new MouseAdapter() {
@Override
public void mouseReleased(MouseEvent e) {
if (end != start) {
Line2D line = new Line2D.Float(start.x, start.y, end.x, end.y);
lines.add(line);
Point2D p = calcCoordinates(e);
start = new Point();
start.x = (int) p.getX();
start.y = (int) p.getY();
repaint();
}
}
});
addMouseMotionListener(new MouseMotionAdapter() {
@Override
public void mouseMoved(MouseEvent e) {
Point2D p = calcCoordinates(e);
end = new Point();
end.x = (int) p.getX();
end.y = (int) p.getY();
repaint();
}
});
}
private Point2D calcCoordinates(MouseEvent e) {
Point p = new Point(e.getX(), e.getY());
try {
return atg.inverseTransform(p, null);
} catch (NoninvertibleTransformException ex) {
return p;
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g.create();
double affineX = (getWidth() - scale * image.getWidth()) / 2;
double affineY = (getHeight() - scale * image.getHeight()) / 2;
AffineTransform at = new AffineTransform();
at.translate(affineX, affineY);
at.scale(scale, scale);
AffineTransform atf = g2D.getTransform();
atf.concatenate(at);
atg = (AffineTransform) atf.clone();
g2D.setTransform(atf);
g2D.drawImage(image, 0, 0, this);
try {
g2D.drawLine(start.x, start.y, end.x, end.y);
} catch (NullPointerException e) {
}
for (Line2D l : lines) {
g2D.draw(l);
}
g2D.dispose();
}
public static void save() {
try {
PDPage page = document.getPage(0);
PDPageContentStream contentStream = new PDPageContentStream(document, page, true, true, true);
for (Line2D l : lines) {
contentStream.moveTo((float) l.getX1(), (float) l.getY1());
contentStream.lineTo((float) l.getX2(), (float) l.getY2());
contentStream.stroke();
}
contentStream.close();
document.save(
new File("path"));
document.close();
} catch (IOException ex) {
Logger.getLogger(Example.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public Dimension getPreferredSize() {
int width = (int) (scale * image.getWidth());
int height = (int) (scale * image.getHeight());
return new Dimension(width, height);
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("PDF");
frame.setSize(1500, 1200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
MyImagePanel imagePanel = null;
try {
imagePanel = new MyImagePanel();
} catch (IOException ex) {
Logger.getLogger(Example.class
.getName()).log(Level.SEVERE, null, ex);
}
JButton btn = new JButton("Save");
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MyImagePanel.save();
}
});
btn.setBounds(10, 0, 70, 30);
frame.add(btn);
JPanel pnl = new JPanel();
pnl.add(imagePanel);
pnl.setBounds(0, 100, 1500, 1200);
frame.add(pnl);
frame.revalidate();
frame.repaint();
frame.setVisible(true);
}
}
package-pdfwriter;
导入java.awt.Dimension;
导入java.awt.Graphics;
导入java.awt.Graphics2D;
导入java.awt.Point;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.event.MouseMotionAdapter;
导入java.awt.geom.AffineTransform;
导入java.awt.geom.Line2D;
导入java.awt.geom.NoninvertibleTransformException;
导入java.awt.geom.Point2D;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.IOException;
导入java.util.ArrayList;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.swing.JButton;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入org.apache.pdfbox.pdmodel.PDDocument;
导入org.apache.pdfbox.pdmodel.PDPage;
导入org.apache.pdfbox.pdmodel.PDPageContentStream;
导入org.apache.pdfbox.rendering.ImageType;
导入org.apache.pdfbox.rendering.PDFRenderer;
公开课范例{
私有静态类MyImagePanel扩展了JPanel{
最终缓冲图像;
最终浮标=0.38f;
仿射型atg;
点开始=新点();
点端点=新点();
布尔值isNewLine=true;
静态ArrayList行=新建ArrayList();
静态文档;
公共MyImagePanel()引发IOException{
document=PDDocument.load(新文件(“路径”);
PDFRender渲染器=新的PDFRender(文档);
image=renderer.renderImageWithDPI(0,200,ImageType.RGB);
addMouseListener(新的MouseAdapter(){
@凌驾
公共无效MouseEvent(MouseEvent e){
如果(结束!=开始){
Line2D line=新的Line2D.Float(start.x,start.y,end.x,end.y);
行。添加(行);
点2D p=坐标(e);
开始=新点();
start.x=(int)p.getX();
start.y=(int)p.getY();
重新油漆();
}
}
});
addMouseMotionListener(新的MouseMotionAdapter(){
@凌驾
public void mouseMoved(MouseEvent e){
点2D p=坐标(e);
结束=新点();
end.x=(int)p.getX();
end.y=(int)p.getY();
重新油漆();
}
});
}
专用点2D坐标(鼠标事件e){
点p=新点(e.getX(),e.getY());
试一试{
返回atg.inverseTransform(p,null);
}捕获(不可逆转换异常){
返回p;
}
}
@凌驾
受保护组件(图形g){
超级组件(g);
Graphics2D g2D=(Graphics2D)g.create();
double affineX=(getWidth()-scale*image.getWidth())/2;
双仿射=(getHeight()-scale*image.getHeight())/2;
AffineTransform at=新的AffineTransform();
at.translate(affineX,affineY);
比例(比例,比例);
仿射变换atf=g2D.getTransform();
atf连接(at);
atg=(仿射转换)atf.clone();
g2D.setTransform(atf);
g2D.drawImage(图像,0,0,this);
试一试{
g2D.绘制线(起点x、起点y、终点x、终点y);
}捕获(NullPointerException e){
}
对于(Line2D l:线){
g2D.图纸(l);
}
g2D.dispose();
}
公共静态void save(){
试一试{
PDPage page=document.getPage(0);
PDPageContentStream contentStream=新的PDPageContentStream(文档、页面、true、true、true);
对于(Line2D l:线){
contentStream.moveTo((float)l.getX1(),(float)l.getY1());
lineTo((float)l.getX2(),(float)l.getY2());
contentStream.stroke();
}
contentStream.close();
document.save(
新文件(“路径”);
document.close();
}捕获(IOEX异常){
Logger.getLogger(例如.class.getName()).log(Level.SEVERE,null,ex);
}
}
@凌驾
公共维度getPreferredSize(){
int width=(int)(scale*image.getWidth());
int height=(int)(scale*image.getHeight());
返回新尺寸(宽度、高度);
}
}
公共静态void main(字符串[]args){
JFrame=新JFrame(“PDF”);
框架设置尺寸(15001200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(空);
MyImagePanel imagePanel=null;
试一试{
imagePanel=新的MyImagePanel();
}捕获(IOEX异常){
getLogger.getLogger(示例.class
.getName()).log(Level.SEVERE,null,ex);
}
JButton btn=新JButton(“保存”);
btn.addActionListener(新ActionListener(){
@凌驾
公共无效行为
for (Line2D l : lines)
{
Point2D p1 = new Point2D.Double(l.getX1(), l.getY1());
Point2D p2 = new Point2D.Double(l.getX2(), l.getY2());
p1 = atg.transform(p1, null);
p2 = atg.transform(p2, null);
contentStream.moveTo((float) p1.getX(), page.getMediaBox().getHeight() - (float) p1.getY());
contentStream.lineTo((float) p2.getX(), page.getMediaBox().getHeight() - (float) p2.getY());
contentStream.stroke();
}
final int DPI = 200;
final float scale = 72f / DPI;
public class SO57387803DrawShapesInPDF
{
private static class MyImagePanel extends JPanel
{
final BufferedImage image;
//final float scale = .38f;
final int DPI = 200;
final float scale = 72f / DPI;
AffineTransform atg;
Point start = new Point();
Point end = new Point();
boolean isNewLine = true;
static ArrayList<Line2D> lines = new ArrayList<>();
static PDDocument document;
public MyImagePanel() throws IOException
{
document = PDDocument.load(new File("XXXX.pdf"));
PDFRenderer renderer = new PDFRenderer(document);
image = renderer.renderImageWithDPI(0, DPI, ImageType.RGB);
addMouseListener(new MouseAdapter()
{
@Override
public void mouseReleased(MouseEvent e)
{
if (end != start)
{
Line2D line = new Line2D.Float(start.x, start.y, end.x, end.y);
lines.add(line);
Point2D p = calcCoordinates(e);
start = new Point();
start.x = (int) p.getX();
start.y = (int) p.getY();
repaint();
}
}
});
addMouseMotionListener(new MouseMotionAdapter()
{
@Override
public void mouseMoved(MouseEvent e)
{
Point2D p = calcCoordinates(e);
end = new Point();
end.x = (int) p.getX();
end.y = (int) p.getY();
repaint();
}
});
}
private Point2D calcCoordinates(MouseEvent e)
{
Point p = new Point(e.getX(), e.getY());
try
{
return atg.inverseTransform(p, null);
}
catch (NoninvertibleTransformException ex)
{
return p;
}
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2D = (Graphics2D) g.create();
double affineX = (getWidth() - scale * image.getWidth()) / 2;
double affineY = (getHeight() - scale * image.getHeight()) / 2;
AffineTransform at = new AffineTransform();
at.translate(affineX, affineY);
at.scale(scale, scale);
AffineTransform atf = g2D.getTransform();
atf.concatenate(at);
atg = (AffineTransform) at.clone();
g2D.setTransform(atf);
g2D.drawImage(image, 0, 0, this);
try
{
g2D.drawLine(start.x, start.y, end.x, end.y);
}
catch (NullPointerException e)
{
}
for (Line2D l : lines)
{
g2D.draw(l);
}
g2D.dispose();
}
public void save()
{
try
{
PDPage page = document.getPage(0);
PDPageContentStream contentStream = new PDPageContentStream(document, page, AppendMode.APPEND, true, true);
for (Line2D l : lines)
{
Point2D p1 = new Point2D.Double(l.getX1(), l.getY1());
Point2D p2 = new Point2D.Double(l.getX2(), l.getY2());
p1 = atg.transform(p1, null);
p2 = atg.transform(p2, null);
//contentStream.moveTo((float) l.getX1(), (float) l.getY1());
//contentStream.lineTo((float) l.getX2(), (float) l.getY2());
contentStream.moveTo((float) p1.getX(), page.getMediaBox().getHeight() - (float) p1.getY());
contentStream.lineTo((float) p2.getX(), page.getMediaBox().getHeight() - (float) p2.getY());
contentStream.stroke();
}
contentStream.close();
document.save(new File("saved.pdf"));
document.close();
}
catch (IOException ex)
{
Logger.getLogger(SO57387803DrawShapesInPDF.class.getName()).log(Level.SEVERE, null, ex);
}
}
@Override
public Dimension getPreferredSize()
{
int width = (int) (scale * image.getWidth());
int height = (int) (scale * image.getHeight());
return new Dimension(width, height);
}
}
public static void main(String[] args)
{
JFrame frame = new JFrame("PDF");
frame.setSize(1500, 1200);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null);
// MyImagePanel imagePanel = null;
MyImagePanel imagePanel;
try
{
imagePanel = new MyImagePanel();
}
catch (IOException ex)
{
Logger.getLogger(SO57387803DrawShapesInPDF.class
.getName()).log(Level.SEVERE, null, ex);
return; // or there would be an uninitialized variable
}
JButton btn = new JButton("Save");
btn.addActionListener(new ActionListener()
{
@Override
public void actionPerformed(ActionEvent e)
{
imagePanel.save();
//MyImagePanel.save();
}
});
btn.setBounds(10, 0, 70, 30);
frame.add(btn);
JPanel pnl = new JPanel();
pnl.add(imagePanel);
pnl.setBounds(0, 100, 1500, 1200);
frame.add(pnl);
frame.revalidate();
frame.repaint();
frame.setVisible(true);
}
}