質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

Q&A

解決済

3回答

2607閲覧

PDFBoxのファイル保存に関するエラー

Shion_Ichikawa

総合スコア56

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

PDF

PDF(Portable Document Format)とはISOによって国際標準として制定されている電子ドキュメント用の拡張子です。

IntelliJ IDEA

IntelliJ IDEA(インテリジェイ アイディア)は、JetBrains社が開発した、 JavaやScalaなどで利用される統合開発環境です。

0グッド

0クリップ

投稿2020/01/26 13:40

編集2020/01/26 13:41

Pdfの並べ替えを行うコードを作っているのですが、
以下のエラーが発生し、保存を行うことができません。
どう改変すればよいでしょうか?
どなたかご教授お願いします。

java

1import java.io.File; 2import java.io.FileOutputStream; 3import java.io.IOException; 4import java.io.OutputStream; 5import java.util.ArrayList; 6 7public class Main { 8 public static void main(String... src) throws IOException { 9 ArrayList<PDPage> pages1 = new ArrayList<PDPage>(); 10 ArrayList<PDPage> pages2 = new ArrayList<PDPage>(); 11 12 13 File file1 = new File("C:\SHARE\Sample1.pdf"); 14 File file2 = new File("C:\SHARE\Sample2.pdf"); 15 try (PDDocument document = PDDocument.load(file1)) { 16 for (PDPage page : document.getPages()) { 17 pages1.add(page); 18 } 19 } catch (IOException e) { 20 e.printStackTrace(); 21 } 22 try (PDDocument document = PDDocument.load(file2)) { 23 for (PDPage page : document.getPages()) { 24 pages2.add(page); 25 } 26 } catch (IOException e) { 27 e.printStackTrace(); 28 } 29 30 if (pages1.size() == pages2.size() && pages1.size() % 2 == 0) { 31 int page1by4=pages1.size()/2; 32 int page1by2=pages1.size(); 33 PDDocument pdDocument = new PDDocument(); 34 System.out.println(pages1.size()); 35 for (int i = 0; i < page1by4; i++) { 36 pdDocument.addPage(pages1.get(1+2*i)); 37 pdDocument.addPage(pages2.get(page1by2-1-2*i)); 38 } 39 for (int i=0; i<page1by4;i++){ 40 pdDocument.addPage(pages2.get(1+2*i)); 41 pdDocument.addPage(pages1.get(page1by2-1-2*i)); 42 } 43 pdDocument.save("Save1.pdf"); 44 pdDocument.close(); 45 46// outputStream.flush(); 47// outputStream.close(); 48 } else { 49 System.out.println("Pages count invalid.."); 50 } 51 } 52} 53
"C:\Program Files\Java\jdk1.8.0_241\bin\java.exe" -Xms2048m -Xmx2048m "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.2\lib\idea_rt.jar=54343:C:\Program Files\JetBrains\IntelliJ IDEA 2019.3.2\bin" -Dfile.encoding=UTF-8 -classpath "C:\Program Files\Java\jdk1.8.0_241\jre\lib\charsets.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\deploy.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\ext\access-bridge-64.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\ext\cldrdata.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\ext\dnsns.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\ext\jaccess.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\ext\jfxrt.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\ext\localedata.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\ext\nashorn.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\ext\sunec.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\ext\sunjce_provider.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\ext\sunmscapi.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\ext\sunpkcs11.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\ext\zipfs.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\javaws.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\jce.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\jfr.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\jfxswt.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\jsse.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\management-agent.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\plugin.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\resources.jar;C:\Program Files\Java\jdk1.8.0_241\jre\lib\rt.jar;C:\Users\shion\IdeaProjects\Pdf Tools for Books\target\classes;C:\Users\shion.m2\repository\org\apache\pdfbox\pdfbox\2.0.18\pdfbox-2.0.18.jar;C:\Users\shion.m2\repository\org\apache\pdfbox\fontbox\2.0.18\fontbox-2.0.18.jar;C:\Users\shion.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar" Main 34 Exception in thread "main" java.io.IOException: COSStream has been closed and cannot be read. Perhaps its enclosing PDDocument has been closed? at org.apache.pdfbox.cos.COSStream.checkClosed(COSStream.java:83) at org.apache.pdfbox.cos.COSStream.createRawInputStream(COSStream.java:133) at org.apache.pdfbox.pdfwriter.COSWriter.visitFromStream(COSWriter.java:1219) at org.apache.pdfbox.cos.COSStream.accept(COSStream.java:404) at org.apache.pdfbox.cos.COSObject.accept(COSObject.java:158) at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObject(COSWriter.java:526) at org.apache.pdfbox.pdfwriter.COSWriter.doWriteObjects(COSWriter.java:464) at org.apache.pdfbox.pdfwriter.COSWriter.doWriteBody(COSWriter.java:448) at org.apache.pdfbox.pdfwriter.COSWriter.visitFromDocument(COSWriter.java:1113) at org.apache.pdfbox.cos.COSDocument.accept(COSDocument.java:449) at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1386) at org.apache.pdfbox.pdfwriter.COSWriter.write(COSWriter.java:1273) at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1357) at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1328) at org.apache.pdfbox.pdmodel.PDDocument.save(PDDocument.java:1316) at Main.main(Main.java:45) Process finished with exit code 1

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

無事に解決されたようですが、もし、自分だったらこう書くかなぁ、という感じで手を入れてみました。よろしければ、参考まで。

  • いちいち、FileChooserでファイルを選ぶのは面倒くさいので、java Main in.pdf in2.pdf out.pdfとコマンドラインでも実行できるようにする。引数でファイルが指定されなかったときは、FileChooserで選択させる。
  • ifのネストが深いので、thenとelseをひっくり返し、ファイルが選択されなかったらさっさと終了する。
  • せっかくなので、当初使っていたtry-with-resourcesを利用する。
  • Threadで処理を実行する意味はなさそうなので、メソッドに切り出す。
  • などなど

なお、TransferHandler_For_JFCはみあたらなかったので、コメントにしました。

java

1import org.apache.pdfbox.pdmodel.PDDocument; 2import org.apache.pdfbox.pdmodel.PDPage; 3 4import javax.swing.*; 5import javax.swing.filechooser.FileNameExtensionFilter; 6import java.io.File; 7import java.io.IOException; 8import java.util.ArrayList; 9import java.util.List; 10 11public class Main { 12 // 13 public static void main(String... src) { 14 try { 15 if (src.length == 3) { 16 joinPDF(new File(src[0]), new File(src[1]), new File(src[2])); 17 } else { 18 showFrame(); 19 } 20 } catch (IOException e) { 21 System.out.println("FAILED"); 22 e.printStackTrace(); 23 } 24 } 25 26 // 27 private static void showFrame() throws IOException { 28 //Settings for Main Frame... 29 JFrame frame = new JFrame(); 30 frame.setBounds(100, 100, 100, 100); 31 frame.setVisible(true); 32 33 //Settings for JFileChooser 34 final JFileChooser jFileChooser = new JFileChooser(); 35 jFileChooser.setMultiSelectionEnabled(false); 36 jFileChooser.setDialogType(JFileChooser.OPEN_DIALOG); 37 jFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 38 jFileChooser.setCurrentDirectory(new File("C:\Users\shion\OneDrive")); 39 jFileChooser.setDragEnabled(true); 40 // jFileChooser.setTransferHandler(new TransferHandler_For_JFC()); 41 jFileChooser.setDialogTitle("Choose the 1nd Pdf to compile..."); 42 jFileChooser.setFileFilter(new FileNameExtensionFilter("PDF File(*.pdf)", "pdf")); 43 44 if (jFileChooser.showOpenDialog(frame) != JFileChooser.APPROVE_OPTION) { 45 System.exit(0); 46 } 47 48 // 49 final JFileChooser jFileChooser1 = new JFileChooser(); 50 jFileChooser1.setMultiSelectionEnabled(false); 51 jFileChooser1.setDialogType(JFileChooser.OPEN_DIALOG); 52 jFileChooser1.setFileSelectionMode(JFileChooser.FILES_ONLY); 53 jFileChooser1.setCurrentDirectory(new File("C:\Users\shion\OneDrive")); 54 jFileChooser1.setDragEnabled(true); 55 // jFileChooser1.setTransferHandler(new TransferHandler_For_JFC()); 56 jFileChooser1.setDialogTitle("Choose the 2nd Pdf to compile..."); 57 jFileChooser1.setFileFilter(new FileNameExtensionFilter("PDF File(*.pdf)", "pdf")); 58 59 if (jFileChooser1.showOpenDialog(frame) != JFileChooser.APPROVE_OPTION) { 60 System.exit(0); 61 } 62 63 // 64 final JFileChooser jFileChooser2 = new JFileChooser(); 65 jFileChooser2.setMultiSelectionEnabled(false); 66 jFileChooser2.setDialogType(JFileChooser.SAVE_DIALOG); 67 jFileChooser2.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 68 jFileChooser2.setCurrentDirectory(new File("C:\Users\shion\OneDrive")); 69 jFileChooser2.setDragEnabled(true); 70 // jFileChooser2.setTransferHandler(new TransferHandler_For_JFC()); 71 jFileChooser2.setDialogTitle("Select Save Location..."); 72 jFileChooser2.setFileFilter(new FileNameExtensionFilter("PDF File(*.pdf)", "pdf")); 73 74 if (jFileChooser2.showOpenDialog(frame) != JFileChooser.APPROVE_OPTION) { 75 System.exit(0); 76 } 77 78 // 79 joinPDF( 80 jFileChooser.getSelectedFile(), 81 jFileChooser1.getSelectedFile(), 82 jFileChooser2.getSelectedFile()); 83 84 System.exit(0); 85 } 86 87 // 88 private static void joinPDF( 89 final File in1, 90 final File in2, 91 final File out 92 ) throws IOException { 93 94 final List<PDPage> pages1 = new ArrayList<>(); 95 final List<PDPage> pages2 = new ArrayList<>(); 96 97 try (PDDocument document1 = PDDocument.load(in1); 98 PDDocument document2 = PDDocument.load(in2);) { 99 for (PDPage page : document1.getPages()) { 100 pages1.add(page); 101 } 102 for (PDPage page : document2.getPages()) { 103 pages2.add(page); 104 } 105 106 if (pages1.size() == pages2.size() && pages1.size() % 2 == 0) { 107 108 try (PDDocument pdDocument = new PDDocument()) { 109 final int page1by4 = pages1.size() / 2; 110 final int page1by2 = pages1.size(); 111 112 System.out.println(pages1.size()); 113 for (int i = 0; i < page1by4; i++) { 114 pdDocument.addPage(pages1.get(2 * i)); 115 pdDocument.addPage(pages2.get(page1by2 - 1 - 2 * i)); 116 } 117 for (int i = 0; i < page1by4; i++) { 118 pdDocument.addPage(pages2.get(2 * i)); 119 pdDocument.addPage(pages1.get(page1by2 - 1 - 2 * i)); 120 } 121 122 // 123 if (out.getName().endsWith(".pdf")) { 124 pdDocument.save(out); 125 } else { 126 pdDocument.save(new File(out.getAbsolutePath() + ".pdf")); 127 } 128 } 129 } else { 130 System.out.println("Pages count invalid.."); 131 } 132 } 133 } 134}

投稿2020/01/28 11:22

shiketa

総合スコア3971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shion_Ichikawa

2020/01/29 07:18

ありがとうございます! ifの分岐の所など、色々改良させていただきました!
guest

0

ベストアンサー

COSStream has been closed ...と言っています。try-with-resourcesを使っている部分、file1, file2のPDFDocumentをclose()するタイミングが早すぎるんですよ。Save1.pdfをclose()するまで待てばいいと思います。

投稿2020/01/27 00:55

shiketa

総合スコア3971

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Shion_Ichikawa

2020/01/27 14:53 編集

ご回答ありがとうございます。 早速、時間をずらすべく工夫をしてみたのですが、 結果的にはThread.start()に落とし込むことで解決することができました。 タスクとして本処理とは別にしなければならないようですね。 個人的に作ったものなので、ソースコードを全て載せました。 自己解決として投稿しましたので上か下に載っていると思います。 本当にご回答いただきありがとうございました!
guest

0

Threadに処理を落とし込むことによって問題を解決することができました。
コードは以下のようになりましたので全て公開します。
自分と同じ穴にはまった人の役に立つことができたら幸いです。

Java

1public class Main { 2 public static void main(String... src) throws IOException { 3 4 //Settings for Main Frame... 5 JFrame frame = new JFrame(); 6 frame.setBounds(100, 100, 100, 100); 7 frame.setVisible(true); 8 9 //Settings for JFileChooser 10 final JFileChooser jFileChooser = new JFileChooser(); 11 jFileChooser.setMultiSelectionEnabled(false); 12 jFileChooser.setDialogType(JFileChooser.OPEN_DIALOG); 13 jFileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY); 14 jFileChooser.setCurrentDirectory(new File("C:\Users\shion\OneDrive")); 15 jFileChooser.setDragEnabled(true); 16 jFileChooser.setTransferHandler(new TransferHandler_For_JFC()); 17 jFileChooser.setDialogTitle("Choose the 1nd Pdf to compile..."); 18 jFileChooser.setFileFilter(new FileNameExtensionFilter("PDF File(*.pdf)","pdf")); 19 final JFileChooser jFileChooser1 = new JFileChooser(); 20 jFileChooser1.setMultiSelectionEnabled(false); 21 jFileChooser1.setDialogType(JFileChooser.OPEN_DIALOG); 22 jFileChooser1.setFileSelectionMode(JFileChooser.FILES_ONLY); 23 jFileChooser1.setCurrentDirectory(new File("C:\Users\shion\OneDrive")); 24 jFileChooser1.setDragEnabled(true); 25 jFileChooser1.setTransferHandler(new TransferHandler_For_JFC()); 26 jFileChooser1.setDialogTitle("Choose the 2nd Pdf to compile..."); 27 jFileChooser1.setFileFilter(new FileNameExtensionFilter("PDF File(*.pdf)","pdf")); 28 final JFileChooser jFileChooser2 = new JFileChooser(); 29 jFileChooser2.setMultiSelectionEnabled(false); 30 jFileChooser2.setDialogType(JFileChooser.SAVE_DIALOG); 31 jFileChooser2.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); 32 jFileChooser2.setCurrentDirectory(new File("C:\Users\shion\OneDrive")); 33 jFileChooser2.setDragEnabled(true); 34 jFileChooser2.setTransferHandler(new TransferHandler_For_JFC()); 35 jFileChooser2.setDialogTitle("Select Save Location..."); 36 jFileChooser2.setFileFilter(new FileNameExtensionFilter("PDF File(*.pdf)","pdf")); 37 if (jFileChooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) { 38 if (jFileChooser1.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) { 39 if (jFileChooser2.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) { 40 41 //Starting new Thread... 42 //This thread will process pdf files and save it in appropriate location... 43 new Thread(new Runnable() { 44 @Override 45 public void run() { 46 List<PDPage> pages1 = new ArrayList<PDPage>(); 47 List<PDPage> pages2 = new ArrayList<PDPage>(); 48 InputStream inputStream1; 49 InputStream inputStream2; 50 try { 51 inputStream1 = new FileInputStream(jFileChooser.getSelectedFile()); 52 inputStream2 = new FileInputStream(jFileChooser1.getSelectedFile()); 53 PDDocument document1 = PDDocument.load(inputStream1); 54 for (PDPage page : document1.getPages()) { 55 pages1.add(page); 56 } 57 PDDocument document2 = PDDocument.load(inputStream2); 58 for (PDPage page : document2.getPages()) { 59 pages2.add(page); 60 } 61 } catch (IOException e) { 62 e.printStackTrace(); 63 } 64 65 if (pages1.size() == pages2.size() && pages1.size() % 2 == 0) { 66 int page1by4 = pages1.size() / 2; 67 int page1by2 = pages1.size(); 68 final PDDocument pdDocument = new PDDocument(); 69 System.out.println(pages1.size()); 70 for (int i = 0; i < page1by4; i++) { 71 pdDocument.addPage(pages1.get(2 * i)); 72 pdDocument.addPage(pages2.get(page1by2 - 1 - 2 * i)); 73 } 74 for (int i = 0; i < page1by4; i++) { 75 pdDocument.addPage(pages2.get(2 * i)); 76 pdDocument.addPage(pages1.get(page1by2 - 1 - 2 * i)); 77 } 78 79 try { 80 if (jFileChooser2.getSelectedFile().getName().endsWith(".pdf")) { 81 pdDocument.save(jFileChooser2.getSelectedFile()); 82 }else { 83 pdDocument.save(new File(jFileChooser2.getSelectedFile().getAbsolutePath()+".pdf")); 84 } 85 pdDocument.close(); 86 87 } catch (IOException e) { 88 System.out.println("FAILED"); 89 e.printStackTrace(); 90 } 91 92 } else { 93 System.out.println("Pages count invalid.."); 94 } 95 System.exit(0); 96 } 97 }).start(); 98 }else{ 99 System.exit(0); 100 } 101 }else{ 102 System.exit(0); 103 } 104 }else{ 105 System.exit(0); 106 } 107 } 108}

投稿2020/01/27 14:51

Shion_Ichikawa

総合スコア56

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問