1

次の問題があります: PDF/A-1A ドキュメントを PDF/A-3A に変換したい。元のドキュメントは、Arobat Reader Pro によって検証されているため、PDF/A-1A 準拠であると想定できます。

次のコードで PDF メタデータを変換しようとしています。

private PDDocumentCatalog makeA3compliant(PDDocument doc) throws IOException, TransformerException  {
PDDocumentCatalog cat = doc.getDocumentCatalog();
PDMetadata metadata = new PDMetadata(doc);
cat.setMetadata(metadata);

XMPMetadata xmp = new XMPMetadata();
XMPSchemaPDFAId pdfaid = new XMPSchemaPDFAId(xmp);
xmp.addSchema(pdfaid);

XMPSchemaDublinCore dc = xmp.addDublinCoreSchema();
String creator = "TestCr";
String producer = "testPr";
dc.addCreator(creator);
dc.setAbout("");

XMPSchemaBasic xsb = xmp.addBasicSchema();
xsb.setAbout("");
xsb.setCreatorTool(creator);
xsb.setCreateDate(GregorianCalendar.getInstance());

PDDocumentInformation pdi = new PDDocumentInformation();
pdi.setProducer(producer);
pdi.setAuthor(creator);
doc.setDocumentInformation(pdi);

XMPSchemaPDF pdf = xmp.addPDFSchema();
pdf.setProducer(producer);
pdf.setAbout("");

PDMarkInfo markinfo = new PDMarkInfo();
markinfo.setMarked(true);
doc.getDocumentCatalog().setMarkInfo(markinfo);

pdfaid.setPart(3);
pdfaid.setConformance("A");
pdfaid.setAbout("");

metadata.importXMPMetadata(xmp);

return cat;

}

新しいファイルを Acrobat で再度検証しようとすると、検証エラーが発生します。

サブセット フォントの CIDset が不完全です (フォントにリストされていないグリフが含まれています)

このオンラインバリデーター ( http://www.pdf-tools.com/pdf/validate-pdfa-online.aspx ) でファイルを検証しようとすると、有効な PDF/A-3A です....

私は何かを逃していますか?

誰も助けることができませんか?

編集:PDFファイルはこちら

4

2 に答える 2

3

OK - callas および/または Adob​​e テクノロジーの観点から、あなたの質問に対する回答があると思います(繰り返しますが、私は callas とその pdfToolbox テクノロジーと提携しており、Acrobat 内でも使用されています)

私の調査と相談した人々によると、サンプルの PDF ドキュメントには、不完全な CID 文字セットのフォントが含まれています。pdfToolbox または Acrobat が有効な PDF/A-1a ファイルであると言うのに、有効な PDF/A-3a ファイルではないのはなぜですか? 興味深い質問:

1) PDF/A-1a と PDF/A-3a の間で、不完全な CID セットのルールが変更されました。PDF/A-3a ではより厳密です。

2) しかし、PDF/A-1a では常に CID セットが必要でしたが、PDF/A-3a では、そのような CID セットがなくても、有効で準拠したファイルを持つことができます。

そのため、PDF ファイルには CID セット (PDF/A-1a および A-3a で有効になります) が含まれていますが、その CID セットは A-1a では問題ありませんが、A-3a に準拠するすべての文字が含まれているわけではありません。

この理論の少なくとも一部をテストするために、「不完全な場合は CIDset を削除する」というタイトルの修正プログラムを使用して、pdfToolbox でファイルを処理しました。その修正 (名前が示すように) は、CID セットをファイルから削除しますが、他は何も変更しません。その後、ファイルは有効な A-3a ファイルとして検証されます。

pdftools の Web サイトが、これが有効な PDF/A-3a ファイルであると主張する理由は疑問です。私が話した人々によると、このファイルのプリフライトの結果は正しく、このファイルにはエラーがあるはずです。したがって、おそらくそれは、pdftools 担当者 (そして、最終的に誰が正しいかを判断するために callas を使用している可能性があります) と取り上げる必要があることです。

これについてさらに議論したい場合は、私に個人的なメッセージを送ってください.

于 2015-07-17T07:53:36.963 に答える
3

これにより、CIDset の問題に関して PDF/A-3 に完全に準拠することができました。

private void removeCidSet(PDDocumentCatalog catalog) {

  COSName cidSet = COSName.getPDFName("CIDSet");

  // iterate over all pdf pages
  for (Object object : catalog.getAllPages()) {
    if (object instanceof PDPage) {

      PDPage page = (PDPage) object;
      Map<String, PDFont> fonts = page.getResources().getFonts();
      Iterator<String> iterator = fonts.keySet().iterator();

      // iterate over all fonts
      while (iterator.hasNext()) {
        PDFont pdFont = fonts.get(iterator.next());

        if (pdFont instanceof PDType0Font) {
          PDType0Font typedFont = (PDType0Font) pdFont;

          if (typedFont.getDescendantFont() instanceof PDCIDFontType2Font) {
            PDCIDFontType2Font f = (PDCIDFontType2Font) typedFont.getDescendantFont();
            PDFontDescriptor fontDescriptor = f.getFontDescriptor();

            if (fontDescriptor instanceof PDFontDescriptorDictionary) {
              PDFontDescriptorDictionary fontDict = (PDFontDescriptorDictionary) fontDescriptor;
              fontDict.getCOSDictionary().removeItem(cidSet);
            }
          }
        }
      }
    }
  }
}
于 2015-07-23T15:35:44.997 に答える