我在代码中寻找了至少一个小时,但找不到错误。我正在使用PDFBox创建PDF(PDFBox HelloWorld示例)。要了解PDFBox的工作原理,我只想创建一些带有“你好世界”和页码的页面,例如“你好世界1”、“你好世界2”等。如您所见,我创建了一个for循环来创建六个页面。
private void drawPDF(PDDocument doc, File file) throws IOException {
for (int pageIndex = 0; pageIndex < 6; pageIndex++) {
PDPage page = new PDPage(PDRectangle.A4);
doc.addPage(page);
PDFont font = PDType1Font.HELVETICA_BOLD;
String message = "hello world " + (pageIndex + 1);
float stringHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() * FONT_SIZE;
PDRectangle pageSize = page.getMediaBox();
try (PDPageContentStream contents = new PDPageContentStream(doc, page)) {
contents.beginText();
contents.setFont(font, FONT_SIZE);
contents.setTextMatrix(Matrix.getTranslateInstance(0, pageSize.getHeight() - stringHeight / 1000f));
contents.showText(message);
System.out.println(message + " - " + doc.getNumberOfPages());
contents.endText();
}
}
doc.save(file);
}
在我的控制台中,我得到以下输出(第一个数字是pageIndex,第二个数字是doc.getNumberOfPages()):
hello world 1 - 1
hello world 2 - 2
hello world 3 - 3
hello world 4 - 4
hello world 5 - 5
hello world 6 - 6
这是我查看pdf的加载函数。
private final ObservableList<Image> pdfFilePages = FXCollections.observableArrayList();
private void loadFile(File file) throws FileNotFoundException, IOException {
if (file != null) {
ByteBuffer buffer = null;
try (RandomAccessFile raf = new RandomAccessFile(file, "r"); FileChannel channel = raf.getChannel()) {
buffer = ByteBuffer.allocate((int) channel.size());
channel.read(buffer);
buffer.flip();
PDFFile pdfFile = new PDFFile(buffer);
List<Image> pages = new ArrayList<>();
for (int i = 0; i < pdfFile.getNumPages(); i++) {
PDFPage page = pdfFile.getPage(i, true);
System.out.println("page: " + i + " - " + pdfFile.getNumPages());
java.awt.geom.Rectangle2D bbox = page.getBBox();
java.awt.geom.Rectangle2D rect = new Rectangle(0, 0, (int) bbox.getWidth(), (int) bbox.getHeight());
BufferedImage buffImage = new BufferedImage((int) (bbox.getWidth() * 2d),
(int) (bbox.getHeight() * 2d), BufferedImage.TYPE_INT_RGB);
java.awt.Image awtImage = page.getImage((int) (bbox.getWidth() * 2.0),
(int) (bbox.getHeight() * 2.0), rect, null, true, true);
java.awt.Graphics2D bufImageGraphics = buffImage.createGraphics();
bufImageGraphics.drawImage(awtImage, 0, 0, null);
Image image = SwingFXUtils.toFXImage(buffImage, null);
pages.add(image);
}
pdfFilePages.addAll(pages);
}
}
}
这是我在控制台中看到的:
page: 0 - 6
page: 1 - 6
page: 2 - 6
page: 3 - 6
page: 4 - 6
page: 5 - 6
当我加载pdf文件以显示应用程序中的内容时,第一页和第二页都会显示“hello world 1-1”。以下页面有“hello world 2-2”到“hello world 5-5”。我不明白为什么我会收到两页“hello world 1-1”。我希望有人能向我解释我在哪里犯了错误。
在mkl的帮助下,我发现了代码中的错误。for循环必须从1开始运行,直到索引等于Pdfile。getNumPages()。当索引为0时,getPage()方法返回第一页。因为在第二次迭代中索引是1,所以第一页将被传递两次。由于循环已完成,最后一页将无法通过。这似乎是正确的方法。
private void loadFile(File file) throws FileNotFoundException, IOException {
if (file != null) {
ByteBuffer buffer = null;
try (RandomAccessFile raf = new RandomAccessFile(file, "r"); FileChannel channel = raf.getChannel()) {
buffer = ByteBuffer.allocate((int) channel.size());
channel.read(buffer);
buffer.flip();
PDFFile pdfFile = new PDFFile(buffer);
List<Image> pages = new ArrayList<>();
for (int i = 1; i <= pdfFile.getNumPages(); i++) {
PDFPage page = pdfFile.getPage(i, true);
System.out.println("page: " + i + " - " + pdfFile.getNumPages());
java.awt.geom.Rectangle2D bbox = page.getBBox();
java.awt.geom.Rectangle2D rect = new Rectangle(0, 0, (int) bbox.getWidth(), (int) bbox.getHeight());
BufferedImage buffImage = new BufferedImage((int) (bbox.getWidth() * 2d),
(int) (bbox.getHeight() * 2d), BufferedImage.TYPE_INT_RGB);
java.awt.Image awtImage = page.getImage((int) (bbox.getWidth() * 2.0),
(int) (bbox.getHeight() * 2.0), rect, null, true, true);
java.awt.Graphics2D bufImageGraphics = buffImage.createGraphics();
bufImageGraphics.drawImage(awtImage, 0, 0, null);
Image image = SwingFXUtils.toFXImage(buffImage, null);
pages.add(image);
}
pdfFilePages.addAll(pages);
}
}
}
这是我的设备 这是我的消息正文作者 我的问题是: 为什么结果似乎不正确?我被放在@JsonRootName(“Facility”)上,并且还启用了包装根特性 我错过了什么
我对云数据流/Apache Beam是个新手,所以概念/编程对我来说还是模糊的。 我想做的是让Dataflow监听Pubsub并以JSON的形式获取这种格式的消息: 并将其转换为: 因此所需的步骤是: > (IngestFromPubsub)通过收听主题从Pubsub获取记录(1条Pubsub消息=1条记录) (EnrichDataFromAPI) a.将有效负载的JSON字符串反序列化为Java
我在我的项目中使用log4j。我想有标准输出、调试记录器和最终报告记录器。调试记录器几乎写调试/信息级别的消息。报告将是不同的记录器,只写信息消息。我尝试了不同的方法,阅读了很多示例,我仍然无法解决这个问题。要么我丢失了我的标准输出,要么我将所有调试写入两个记录器。 我的密码在这里 } 任何提示都将不胜感激
当我尝试向我的plivo号码发送消息时,它显示以下错误 “此呼叫者id不允许用于出站消息”
我是Spring MVC框架的新手。我试图在我的Spring项目中使用Hibernate返回object来检索用户详细信息。我得到以下错误: 警告:org.springframework.web.servlet.mvc.support.defaultHandlerExceptionResolver-无法写入HTTP消息:org.springframework.HTTP.converter.http
我已经创建了一个JFrame,里面有一个JTable,我可以在单元格上写信息。我可以单击Save JMenuItem Save并将信息写入txt文件。然而,当我试图读取文件并将其返回到表中时,我面临三个问题。 JTable由30行组成。当代码读取txt文件时,在第30行下面添加行。是否有办法从第一行而不是第31行开始填充输入?--已解决 数据写入不正确。所有这些都写在第一列——已解决 如何去掉“n