Создание PDF-файла в Java с использованием PDDocument приводит к повреждению PDF-файлов - PullRequest
0 голосов
/ 24 сентября 2019

Я пытаюсь создать временные PDF файлы в Java, используя PDDocument.Я использую следующий метод для создания временного PDF файла.

/* Create a temporary PDF file.*/
private File createPdf(String fileName) throws IOException {
    final PDDocument document = new PDDocument();
    final File file = File.createTempFile(fileName, ".pdf");
    //write it
    BufferedWriter bw = new BufferedWriter(new FileWriter(file));
    bw.write("This is the temporary pdf file content");
    bw.close();
    document.save(file);        
    document.close();
    return file;
}

Это тест.

@Test
public void testCreateAndMergePdfs() throws IOException {
    Collection<File> pdfs = new ArrayList<>(Arrays.asList(createPdf("File1"), createPdf("File2")));
    assertFalse(CollectionUtils.isEmpty(pdfs));
    PdfPrintPojo pdfPrintPojo = new PdfPrintPojo(pdfs);
    File mergedFile = service.createAndMergePDFs(pdfPrintPojo, "Merged");
    assertNotNull(mergedFile);
    List<File> list = new ArrayList<>(pdfs);
    File file1 = list.get(0);
    File file2 = list.get(1);
    assertTrue(FileUtils.contentEquals(file1, file2));
}

Что я пытаюсь сделать здесь, это создатьи объединить два PDF файла.Когда я запускаю тест, он создает два файла PDF в папке temp, например, \AppData\Local\Temp\File16375814641476797612.pdf и \AppData\Local\Temp\File24102718409195239661.pdf и объединенный файл в \AppData\Local\Temp\Merged_merged_3755858389884894769.pdf.Но тест не проходит в assertTrue(FileUtils.contentEquals(file1, file2)); Когда я пытаюсь открыть файлы PDF в папке temp, он говорит, что PDF поврежден.Кроме того, я понятия не имею, почему файлы не сохраняются как File1 и File2.Кто-нибудь может мне с этим помочь?

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Используя Учебник Apache PDFBox , мне удалось создать рабочие файлы PDF.Метод был изменен следующим образом.

/* Create a temporary PDF file.*/
private File createPdf(String fileName) throws IOException {
    // Create a document and add a page to it
    final PDDocument document = new PDDocument();
    PDPage page = new PDPage();
    document.addPage(page);

    // Create a new font object selecting one of the PDF base fonts
    PDFont font = PDType1Font.HELVETICA_BOLD;

    // Start a new content stream which will "hold" the to be created content
    PDPageContentStream contentStream = new PDPageContentStream(document, page);

    // Define a text content stream using the selected font, moving the cursor and drawing the text "Hello World"
    contentStream.beginText();
    contentStream.setFont(font, 12);
    contentStream.newLineAtOffset(100, 700);
    contentStream.showText("Hello World");
    contentStream.endText();

    // Make sure that the content stream is closed:
    contentStream.close();

    // Save the results and ensure that the document is properly closed:
    File file = File.createTempFile(fileName, ".pdf");
    document.save(file);
    document.close();
    return file;
}

Что касается теста, я использовал подход PDDocument для загрузки файлов, затем извлек данные в виде строки, используя PDFTextStripper и используя утверждения в этих строках..

 @Test
public void testCreateAndMergePdfs() throws IOException {
    Collection<File> pdfs = new ArrayList<>(Arrays.asList(createPdf("File1"), createPdf("File2")));
    assertFalse(CollectionUtils.isEmpty(pdfs));
    PdfPrintPojo pdfPrintPojo = new PdfPrintPojo(pdfs);
    File mergedFile = service.createAndMergePDFs(pdfPrintPojo, "Merged");
    assertNotNull(mergedFile);
    List<File> list = new ArrayList<>(pdfs);

    /* Load the PDF files and extract data as String. */
    PDDocument document1 = PDDocument.load(list.get(0));
    PDDocument document2 = PDDocument.load(list.get(1));
    PDDocument merged = PDDocument.load(mergedFile);

    PDFTextStripper stripper = new PDFTextStripper();
    String file1Data = stripper.getText(document1);
    String file2Data = stripper.getText(document2);
    String mergedData = stripper.getText(merged);

    /* Assert that data from file 1 and 2 are equal with each other and merged file. */
    assertEquals(file1Data, file2Data);
    assertEquals(file1Data + file2Data, mergedData);
}
1 голос
/ 24 сентября 2019

То, как вы сравниваете содержимое файла, немного отличается. Можете попробовать ниже:

@Test
public void testCreateAndMergePdfs() {
    Assert.assertEquals(FileUtils.readLines(file1), FileUtils.readLines(file2));
} 

Или вы можете попробовать

    byte[] file1Bytes = Files.readAllBytes(Paths.get("Path to File 1"));
    byte[] file2Bytes = Files.readAllBytes(Paths.get("Path to File 2"));

    String file1 = new String(file1Bytes, StandardCharsets.UTF_8);
    String file2 = new String(file2Bytes, StandardCharsets.UTF_8);

    assertEquals("The content in the strings should match", file1, file2);

Или

    File file1 = new File(file1);
    File file2 = new File(file2);
    assertThat(file1).hasSameContentAs(file2);
...