当前位置: 首页 > 知识库问答 >
问题:

如何更改页面原点?-图像插入在意外的位置

曹和正
2023-03-14

使用iText 7.1.9 java edition,我试图在固定/绝对位置向PDF添加图像,如果PDF不是横向的,那么我将其旋转90度,但是,一旦页面旋转,原点(原来是左下角)也会旋转(现在在左上角,旋转90度),因此,当我插入图像时,它最终会旋转并使用错误的原点。请参阅下面链接的两个PDF示例,了解正在发生的情况。

有什么方法可以在页面旋转后将页面原点更改为左下角?有没有比使用PdfDocument.getPage(p). setRotation更好的方法来旋转页面?

我是否应该简单地旋转图像并做一些数学运算来计算出任何附加元素的新位置?我尝试使用imageData旋转图像。设置旋转(90),但它似乎不起任何作用。

以下是使用本问题底部所附PDF格式的输入:

//String pdfPath = "before_expected.pdf";
//String pdfDest = "after_expected.pdf";
//Or
String pdfPath = "before_unexpected.pdf";
String pdfDest = "after_unexpected.pdf";

以下是我旋转页面和添加图像的代码:

//Open existing PDF
FileInputStream inputStream = new FileInputStream(pdfPath);
PdfReader reader = new PdfReader(inputStream).setUnethicalReading(true);

//Create new PDF
FileOutputStream outputStream = new FileOutputStream(pdfDest);
PdfWriter writer = new PdfWriter(outputStream);
PdfDocument pdfDocument = new PdfDocument(reader, writer);

//Load sample image
ImageData imageData = ImageDataFactory.create("C:/sample_image.png");
Image image = new Image(imageData);

//Get root element of PDF
Document document = new Document(pdfDocument);

//Get orientation
Rectangle pageSize = pdfDocument.getPage(1).getPageSize();
System.out.println("Original rotation " + pdfDocument.getPage(1).getRotation() + System.lineSeparator() + pageSize.toString());
//Rotate 90 if page is not landscape - placeholder
if (pageSize.getHeight() > pageSize.getWidth())
{
    pdfDocument.getPage(1).setRotation(pdfDocument.getPage(1).getRotation() + 90);
}

//Find page size
Rectangle currentPageSize = pdfDocument.getPage(1).getPageSizeWithRotation();
//Locate image 40% across page and 20% up page
float absoluteXpos = currentPageSize.getWidth() * 0.4f;
float absoluteYpos = currentPageSize.getHeight() * 0.2f;
System.out.println("Image location from origin: " + absoluteXpos + ", "+absoluteYpos);

//Add image
image.setFixedPosition(absoluteXpos, absoluteYpos);
document.add(image);

//Removed code to close any tidy up
document.close();

第二个PDF(在_unexpected.PDF之前)的输出显示它是旋转的,但如上所述,进一步旋转页面似乎对添加其他内容没有影响:

Original rotation 90
Rectangle: 842.0x1191.0
Image location from origin: 336.80002, 238.2

前两个图像显示预期/期望的行为,最后两个显示图像如何插入错误的位置(基于不正确的原点/旋转)。

共有1个答案

伏砚
2023-03-14

首先,在确定当前页面是否为横向时(if(pageSize.getHeight())

第二,如果您想将一些内容添加到与页面旋转无关的固定位置,可以在添加内容之前使用以下说明:

pdfDocument.getPage(1).setIgnorePageRotationForContent(true);

完整代码:

//Open existing PDF
FileInputStream inputStream = new FileInputStream("C:/in.pdf");
PdfReader reader = new PdfReader(inputStream).setUnethicalReading(true);

//Create new PDF
FileOutputStream outputStream = new FileOutputStream("C:/Users/Alexey/Desktop/exp.pdf");
PdfWriter writer = new PdfWriter(outputStream);
PdfDocument pdfDocument = new PdfDocument(reader, writer);

//Load sample image
ImageData imageData = ImageDataFactory.create("C:/sample_image.png");
Image image = new Image(imageData);

//Get root element of PDF
pdfDocument.getPage(1).setIgnorePageRotationForContent(true);
Document document = new Document(pdfDocument);

//Get orientation
Rectangle pageSize = pdfDocument.getPage(1).getPageSizeWithRotation();
System.out.println("Original rotation " + pdfDocument.getPage(1).getRotation() + System.lineSeparator() + pageSize.toString());
//Rotate 90 if page is not landscape - placeholder
if (pageSize.getHeight() > pageSize.getWidth())
{
    pdfDocument.getPage(1).setRotation(pdfDocument.getPage(1).getRotation() + 90);
}

//Find page size
Rectangle currentPageSize = pdfDocument.getPage(1).getPageSizeWithRotation();
//Locate image 40% across page and 20% up page
float absoluteXpos = currentPageSize.getWidth() * 0.4f;
float absoluteYpos = currentPageSize.getHeight() * 0.2f;
System.out.println("Image location from origin: " + absoluteXpos + ", "+absoluteYpos);

//Add image
image.setFixedPosition(absoluteXpos, absoluteYpos);
document.add(image);

//Removed code to close any tidy up
document.close();

它为两个输入文件提供了相同的结果:

 类似资料:
  • 我尝试使用localStorage保存输入元素的位置。我保存了输入元素的位置,在重新加载页面后,我可以访问它,但在刷新页面后,它始终处于默认位置。(值真/假) HTML: JS: 明确地说,我正在创建chrome扩展(选项页)。 编辑:

  • 我看了其他答案,试着: 以及: 在类中,我把图像文件放在资源文件夹中,也放在与我的文件和我项目的根文件夹中,甚至在开始时包含了/符号URL字符串,但没有工作。我想知道最近有没有人尝试过并成功了?

  • 我想做什么? 我想使用命令行插入图片到MariaDB数据库,使用LOAD_FILE功能。 发生了什么? 我总是得到一个NULL返回。 我不想要这样的解决方案:这是糟糕的风格,到目前为止我还没有看到过-尝试存储完整的路径!我想将此图片存储在这个数据库中,而不是路径中。 系统 > ArchLinux 4.7.2-1-ARCH 一张叫做“测试”的照片。jpg(817KB)位于,甚至在 这张图片属于用户和

  • 问题内容: 我正在尝试使用Swift更改UIButton的图像…我该怎么办 这是OBJ-C代码。但是我不知道Swift: 问题答案: 从您的Obc-C代码中,我认为您想为按钮设置图片,因此请尝试以下方式: 简而言之: 对于Swift 3:

  • 问题内容: 情况: 在PDFBox中,PDRectangle对象的默认原点(0,0)似乎是页面的左下角。 例如,以下代码在页面的左下角为您提供一个正方形,并且每边长100个单位。 问题: 是否可以将原点更改为UPPER-LEFT角,例如,上面的代码将在页面的UPPER-LEFT角处为您提供相同的正方形? 我问的原因: 我正在使用PDFTextStripper获取文本的坐标(通过使用提取的TextP

  • 我从服务器接收图像,然后根据用户选择的颜色,图像颜色将发生变化。 我尝试了以下方法: 我得到了与我的目标相反的结果(UIImage外部的白色是用所选颜色着色的)。 出了什么问题? 在这个问题上我也需要这样做,提供的解决方案不能解决我的问题。如何更改iOS和WatchKit中的图像颜色