1

PDF/A 1b ファイルを連結したい。

私はitextを使用してPdfACopy.getImportedPageいますが、エラーはありません。Itext の適合性チェックは問題ありません。

問題ないように見える PDF/A 1b ファイルを取得しました。

pdfboxを使用して PDF/A 準拠を確認すると、多くのエラーが発生します。

2.4.3 : Invalid Color space, DestOutputProfile is missing
2.4.3 : Invalid Color space, The operator "g" can't be used without Color Profile
2.4.3 : Invalid Color space, The operator "f" can't be used without Color Profile
2.4.1 : Invalid Color space, The operator "rg" can't be used with CMYK Profile
2.4.3 : Invalid Color space, DestOutputProfile is missing

NB : すべての入力 PDF は有効な PDF/A 1b です

PDF/A 1bに準拠していないPDF/Aを取得するために使用したサンプルコードは次のとおりです

Document document = new Document();
PdfACopy copy = new PdfACopy(document, new FileOutputStream(outFile), pdfAConformanceLevel);

document.open();

PdfReader reader;
int n;
for (int i = 0; i < args.length - 1; i++)
{
  reader = new PdfReader(args[i]);
  n = reader.getNumberOfPages();
  for (int page = 0; page < n;)
  {
    copy.addPage(copy.getImportedPage(reader, ++page));
  }

}

copy.createXmpMetadata();

document.close();

それで私は怒って、それを整理することにしました。

このPDF からの ICC プロファイルのダンプ例を使用すると、生成された PDF/A に実際に ICC プロファイルが含まれていないことがわかります。

このチュートリアルを見た後、最終的にコードを使用してPdfWriter.setOutputIntents(final PdfReader reader, final boolean checkExistence)、入力 PDF/A で出力インテントを取得し、それを出力 PDF/A に戻しました。

そして、それは動作します...

最初にパブリックメソッドを作成しました

public static void copyOutputIntents(PdfReader reader, PdfACopy copy) throws IOException {


    PdfDictionary catalog = reader.getCatalog();

    PdfArray outs = catalog.getAsArray(PdfName.OUTPUTINTENTS);
    if (outs == null)
    {
        Logger.err("Reggie Watts gonna get you !!!");
    }
    else
    {
        if (outs.isEmpty())
        {
            Logger.err("Reggie Watts gonna get you !!!");
        }
        PdfDictionary out = outs.getAsDict(0);

        PRStream stream = (PRStream) PdfReader.getPdfObject(out.get(PdfName.DESTOUTPUTPROFILE));
        byte destProfile[] = null;
        if (stream != null)
        {
            destProfile = PdfReader.getStreamBytes(stream);
        }
        copy.setOutputIntents(getNameString(out, PdfName.OUTPUTCONDITIONIDENTIFIER), getNameString(out, PdfName.OUTPUTCONDITION), getNameString(out, PdfName.REGISTRYNAME), getNameString(out, PdfName.INFO), destProfile);

    }
}

getNameStringまた、単に一括コピーしたメソッドを追加する必要がありました。

したがって、私のコードは有効な PDF/A を生成するようになりました:

Document document = new Document();
PdfACopy copy = new PdfACopy(document, new FileOutputStream(outFile), pdfAConformanceLevel);

document.open();

PdfReader reader;
int n;
for (int i = 0; i < args.length - 1; i++)
{
  reader = new PdfReader(args[i]);
  n = reader.getNumberOfPages();
  for (int page = 0; page < n;)
  {
    copy.addPage(copy.getImportedPage(reader, ++page));
  }
  // get last PDF's intent and put it into the output one
  Stamper.copyOutputIntents(reader, copy);
}

copy.createXmpMetadata();

document.close();

PdfACopy.addPage追加されたページの出力インテントを保持したり、何らかの方法で処理したりすべきではありませんか?

有効な PDF/A ファイルを生成できない高レベルのクラスを持つ意味がわかりません。

何か不足していますか?私は夢中になりましたか?

長い投稿で申し訳ありません。

4

0 に答える 0