PDF文書のContent(記載項目)を削除または追加します。
Toolbox add-onは以下のContent(記載項目)タイプを追加または削除します。
Text
Image
Image Mask
Path
Toolbox Add-onのAPIリファレンスはこちらです。(すべて英文)
C#のサンプルプロジェクトではPdftools SDK(Toolbox Add-on)ライブラリ(DLL)をNuGetから自動でダウンロードします。
CのサンプルプロジェクトにはPdftools SDK(Toolbox Add-on)ライブラリ(DLL)が含まれています。
ライセンスキー無し(無償)で試用できます。ただし、結果に「透かし」が入ります。
「透かし」の削除をご希望の場合は問い合わせページまたはメールでお問い合わせください。
License Agreement(利用許諾契約書)が含まれていますので必ず確認してください。
PDFドキュメントの先頭ページの指定された位置にテキストを追加します。
// 入力PDFをオープン pInStream = _tfopen(szInPath, _T("rb")); GOTO_CLEANUP_IF_NULL(pInStream, _T("Failed to open input file \"%s\".\n"), szInPath); PtxSysCreateFILEStreamDescriptor(&descriptor, pInStream, 0); pInDoc = PtxPdf_Document_Open(&descriptor, _T("")); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInDoc, _T("Input file \"%s\" cannot be opened. %s (ErrorCode: 0x%08x).\n"), szInPath, szErrorBuff, Ptx_GetLastError()); // 出力PDFを作成 pOutStream = _tfopen(szOutPath, _T("wb+")); GOTO_CLEANUP_IF_NULL(pOutStream, _T("Failed to open output file \"%s\".\n"), szOutPath); PtxSysCreateFILEStreamDescriptor(&outDescriptor, pOutStream, 0); iConformance = PtxPdf_Document_GetConformance(pInDoc); pOutDoc = PtxPdf_Document_Create(&outDescriptor, &iConformance, NULL); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutDoc, _T("Output file \"%s\" cannot be created. %s (ErrorCode: 0x%08x).\n"), szOutPath, szErrorBuff, Ptx_GetLastError()); // 出力PDFに埋め込みフォントを作成 pFont = PtxPdfContent_Font_CreateFromSystem(pOutDoc, _T("Arial"), _T("Italic"), TRUE); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pFont, _T("Failed to create font. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // ドキュメント全体のデータをコピー GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(copyDocumentData(pInDoc, pOutDoc), _T("Failed to copy document-wide data. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // コピーオプションを設定 pCopyOptions = PtxPdf_PageCopyOptions_New(); // 入力PDFと出力PDFのページリストを取得 pInPageList = PtxPdf_Document_GetPages(pInDoc); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPageList, _T("Failed to get the pages of the input document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); pOutPageList = PtxPdf_Document_GetPages(pOutDoc); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPageList, _T("Failed to get the pages of the output document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // 先頭ページをコピー pInPage = PtxPdf_PageList_Get(pInPageList, 0); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPage, _T("Failed to get the first page. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); pOutPage = PtxPdf_Page_Copy(pOutDoc, pInPage, pCopyOptions); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPage, _T("Failed to copy page. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // コピーしたページにテキストを追加 if (addText(pOutDoc, pOutPage, szTextString, pFont, 15) != 0) goto cleanup; // 出力PDFにページを追加 GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_PageList_Add(pOutPageList, pOutPage), _T("Failed to add page to output document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // 入力から残りのページを取得 pInPageRange = PtxPdf_PageList_GetRange(pInPageList, 1, PtxPdf_PageList_GetCount(pInPageList) - 1); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPageRange, _T("Failed to get page range from input document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // 取得した(残りの)ページを出力にコピー pOutPageRange = PtxPdf_PageList_Copy(pOutDoc, pInPageRange, pCopyOptions); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPageRange, _T("Failed to copy page range to output document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // コピーしたページを出力ドキュメントに追加 GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_PageList_AddRange(pOutPageList, pOutPageRange), _T("Failed to add page range to output page list. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError());
int copyDocumentData(TPtxPdf_Document* pInDoc, TPtxPdf_Document* pOutDoc) { TPtxPdf_FileReferenceList* pInFileRefList; TPtxPdf_FileReferenceList* pOutFileRefList; // 出力設定 if (PtxPdf_Document_GetOutputIntent(pInDoc) != NULL) if (PtxPdf_Document_SetOutputIntent(pOutDoc, PtxPdfContent_IccBasedColorSpace_Copy( pOutDoc, PtxPdf_Document_GetOutputIntent(pInDoc))) == FALSE) return FALSE; // メタデータ if (PtxPdf_Document_SetMetadata(pOutDoc, PtxPdf_Metadata_Copy(pOutDoc, PtxPdf_Document_GetMetadata(pInDoc))) == FALSE) return FALSE; // ビュワー設定 if (PtxPdf_Document_SetViewerSettings( pOutDoc, PtxPdfNav_ViewerSettings_Copy(pOutDoc, PtxPdf_Document_GetViewerSettings(pInDoc))) == FALSE) return FALSE; // 関連ファイル(PDF/A-3およびPDF 2.0のみ) pInFileRefList = PtxPdf_Document_GetAssociatedFiles(pInDoc); pOutFileRefList = PtxPdf_Document_GetAssociatedFiles(pOutDoc); if (pInFileRefList == NULL || pOutFileRefList == NULL) return FALSE; for (int iFileRef = 0; iFileRef < PtxPdf_FileReferenceList_GetCount(pInFileRefList); iFileRef++) if (PtxPdf_FileReferenceList_Add( pOutFileRefList, PtxPdf_FileReference_Copy(pOutDoc, PtxPdf_FileReferenceList_Get(pInFileRefList, iFileRef))) == FALSE) return FALSE; // プレーンな埋め込みファイル pInFileRefList = PtxPdf_Document_GetPlainEmbeddedFiles(pInDoc); pOutFileRefList = PtxPdf_Document_GetPlainEmbeddedFiles(pOutDoc); if (pInFileRefList == NULL || pOutFileRefList == NULL) return FALSE; for (int iFileRef = 0; iFileRef < PtxPdf_FileReferenceList_GetCount(pInFileRefList); iFileRef++) if (PtxPdf_FileReferenceList_Add( pOutFileRefList, PtxPdf_FileReference_Copy(pOutDoc, PtxPdf_FileReferenceList_Get(pInFileRefList, iFileRef))) == FALSE) return FALSE; return TRUE; }
int addText(TPtxPdf_Document* pOutDoc, TPtxPdf_Page* pOutPage, TCHAR* szTextString, TPtxPdfContent_Font* pFont, double dFontSize) { TPtxPdfContent_Content* pContent = NULL; TPtxPdfContent_ContentGenerator* pGenerator = NULL; TPtxPdfContent_Text* pText = NULL; TPtxPdfContent_TextGenerator* pTextGenerator = NULL; TPtxGeomReal_Size size; TPtxGeomReal_Point position; double dFontAscent; pContent = PtxPdf_Page_GetContent(pOutPage); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pContent, _T("Failed to get content of output file. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // コンテンツジェネレータを作成 pGenerator = PtxPdfContent_ContentGenerator_New(pContent, FALSE); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pGenerator, _T("Failed to create a content generator. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // テキストオブジェクトを作成 pText = PtxPdfContent_Text_Create(pOutDoc); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pText, _T("Failed to create text object. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // テキストジェネレータを作成 pTextGenerator = PtxPdfContent_TextGenerator_New(pText, pFont, dFontSize, NULL); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pTextGenerator, _T("Failed to create a text generator. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // 出力ページサイズを取得 GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_Page_GetSize(pOutPage, &size), _T("Failed to read page size. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); dFontAscent = PtxPdfContent_Font_GetAscent(pFont); GOTO_CLEANUP_IF_ZERO_PRINT_ERROR(dFontAscent, _T("%s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // 位置を計算 position.dX = dBorder; position.dY = size.dHeight - dBorder - dFontSize * dFontAscent; // 位置に移動 GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdfContent_TextGenerator_MoveTo(pTextGenerator, &position), _T("Failed to move to position. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // 指定されたテキスト文字列を追加 GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdfContent_TextGenerator_ShowLine(pTextGenerator, szTextString), _T("Failed to add text string. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // テキストジェネレータを閉じる PtxPdfContent_TextGenerator_Close(pTextGenerator); pTextGenerator = NULL; // 配置されたテキストを描画 GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdfContent_ContentGenerator_PaintText(pGenerator, pText), _T("Failed to paint the positioned text. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); cleanup: if (pTextGenerator != NULL) PtxPdfContent_TextGenerator_Close(pTextGenerator); if (pText != NULL) Ptx_Release(pText); if (pGenerator != NULL) PtxPdfContent_ContentGenerator_Close(pGenerator); if (pContent != NULL) Ptx_Release(pContent); return iReturnValue; }
// 入力PDFを開く using (Stream inStream = new FileStream(inPath, FileMode.Open, FileAccess.Read)) using (Document inDoc = Document.Open(inStream, null)) // Create output document using (Stream outStream = new FileStream(outPath, FileMode.Create, FileAccess.ReadWrite)) using (Document outDoc = Document.Create(outStream, inDoc.Conformance, null)) { // ドキュメント全体のデータをコピー CopyDocumentData(inDoc, outDoc); // フォントを作成 font = Font.CreateFromSystem(outDoc, "Arial", "Italic", true); // ページのコピーオプションを定義 PageCopyOptions copyOptions = new PageCopyOptions(); // 先頭のページをコピーし、そこにテキストを追加して出力ドキュメントに追加 Page outPage = Page.Copy(outDoc, inDoc.Pages[0], copyOptions); AddText(outDoc, outPage, textString); outDoc.Pages.Add(outPage); // 残りのページをコピーして出力ドキュメントに追加 PageList inPageRange = inDoc.Pages.GetRange(1, inDoc.Pages.Count - 1); PageList copiedPages = PageList.Copy(outDoc, inPageRange, copyOptions); outDoc.Pages.AddRange(copiedPages); }
private static void CopyDocumentData(Document inDoc, Document outDoc) { // ドキュメント全体のデータをコピー // 入力設定 if (inDoc.OutputIntent != null) outDoc.OutputIntent = IccBasedColorSpace.Copy(outDoc, inDoc.OutputIntent); // メタデータ outDoc.Metadata = Metadata.Copy(outDoc, inDoc.Metadata); // ビュワー設定 outDoc.ViewerSettings = ViewerSettings.Copy(outDoc, inDoc.ViewerSettings); // 関連ファイル(PDF/A-3およびPDF 2.0のみ) FileReferenceList outAssociatedFiles = outDoc.AssociatedFiles; foreach (FileReference inFileRef in inDoc.AssociatedFiles) outAssociatedFiles.Add(FileReference.Copy(outDoc, inFileRef)); // プレーンな埋め込みファイル FileReferenceList outEmbeddedFiles = outDoc.PlainEmbeddedFiles; foreach (FileReference inFileRef in inDoc.PlainEmbeddedFiles) outEmbeddedFiles.Add(FileReference.Copy(outDoc, inFileRef)); }
private static void AddText(Document outputDoc, Page outPage, string textString) { // コンテンツジェネレータとテキストオブジェクトを作成 using ContentGenerator gen = new ContentGenerator(outPage.Content, false); Text text = Text.Create(outputDoc); // テキストジェネレータを作成 using (TextGenerator textGenerator = new TextGenerator(text, font, fontSize, null)) { // 位置を計算 Point position = new Point { X = border, Y = outPage.Size.Height - border - fontSize * font.Ascent }; // 位置に移動 textGenerator.MoveTo(position); // 指定されたテキスト文字列を追加 textGenerator.ShowLine(textString); } // 配置されたテキストを描画 gen.PaintText(text); }
入力PDFの文字列を出力PDFにコピーする際に、先頭2文字を削除してから出力PDFに格納します。
// 入力PDFを開く using (Stream inStream = new FileStream(inPath, FileMode.Open, FileAccess.Read)) using (Document inDoc = Document.Open(inStream, null)) // 出力PDFを生成 using (Stream outStream = new FileStream(outPath, FileMode.Create, FileAccess.ReadWrite)) using (Document outDoc = Document.Create(outStream, inDoc.Conformance, null)) { // ドキュメント全体のデータをコピー CopyDocumentData(inDoc, outDoc); // 各ページを処理 foreach (var inPage in inDoc.Pages) { // 空の出力ページを作成 Page outPage = Page.Create(outDoc, inPage.Size); // 入力から出力にページコンテンツをコピーし、グリフを削除 CopyContentAndRemoveGlyphs(inPage.Content, outPage.Content, outDoc); // 新しいページを出力ドキュメントのページリストに追加 outDoc.Pages.Add(outPage); } }
private static void CopyDocumentData(Document inDoc, Document outDoc) { // ドキュメント全体のデータをコピー // 出力設定 if (inDoc.OutputIntent != null) outDoc.OutputIntent = IccBasedColorSpace.Copy(outDoc, inDoc.OutputIntent); // メタデータ outDoc.Metadata = Metadata.Copy(outDoc, inDoc.Metadata); // ビュワー設定 outDoc.ViewerSettings = ViewerSettings.Copy(outDoc, inDoc.ViewerSettings); // 関連ファイル(PDF/A-3およびPDF 2.0のみ) FileReferenceList outAssociatedFiles = outDoc.AssociatedFiles; foreach (FileReference inFileRef in inDoc.AssociatedFiles) outAssociatedFiles.Add(FileReference.Copy(outDoc, inFileRef)); // プレーンな埋め込みファイル FileReferenceList outEmbeddedFiles = outDoc.PlainEmbeddedFiles; foreach (FileReference inFileRef in inDoc.PlainEmbeddedFiles) outEmbeddedFiles.Add(FileReference.Copy(outDoc, inFileRef)); }
private static void CopyContentAndRemoveGlyphs(Content inContent, Content outContent, Document outDoc) { // コンテンツ抽出ツールとコンテンツジェネレータを使用してコンテンツをコピー ContentExtractor extractor = new ContentExtractor(inContent); using ContentGenerator generator = new ContentGenerator(outContent, false); // すべてのコンテンツ要素を反復処理 foreach (ContentElement inElement in extractor) { ContentElement outElement; // グループ要素の特別な処理 if (inElement is GroupElement inGroupElement) { // 空の出力グループ要素を作成 GroupElement outGroupElement = GroupElement.CopyWithoutContent(outDoc, inGroupElement); outElement = outGroupElement; // グループ要素のコンテンツに対してCopyContentAndRemoveGlyphs()を再帰的にコール CopyContentAndRemoveGlyphs(inGroupElement.Group.Content, outGroupElement.Group.Content, outDoc); } else { // コンテンツ要素を出力ドキュメントにコピー outElement = ContentElement.Copy(outDoc, inElement); if (outElement is TextElement outTextElement) { // テキスト要素の特別な処理 Text text = outTextElement.Text; // 各テキストフラグメントから最初の2つのグリフを削除 foreach (var fragment in text) { // フラグメントに2つ以上のグリフがあることを確認 if (fragment.Count > 2) { // RemoveAtを2回コール fragment.RemoveAt(0); fragment.RemoveAt(0); } } } } // 完成した出力要素をコンテンツジェネレーターに追加 generator.AppendContentElement(outElement); } }
サイズ指定された画像をページの指定場所に配置します。
// 入力PDFを開く pInStream = _tfopen(szInPath, _T("rb")); GOTO_CLEANUP_IF_NULL(pInStream, _T("Failed to open input file \"%s\".\n"), szInPath); PtxSysCreateFILEStreamDescriptor(&descriptor, pInStream, 0); pInDoc = PtxPdf_Document_Open(&descriptor, _T("")); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInDoc, _T("Input file \"%s\" cannot cannot be opened. %s (ErrorCode: 0x%08x).\n"), szInPath, szErrorBuff, Ptx_GetLastError()); // 出力PDFを作成 pOutStream = _tfopen(szOutPath, _T("wb+")); GOTO_CLEANUP_IF_NULL(pOutStream, _T("Failed to open output file \"%s\".\n"), szOutPath); PtxSysCreateFILEStreamDescriptor(&outDescriptor, pOutStream, 0); iConformance = PtxPdf_Document_GetConformance(pInDoc); pOutDoc = PtxPdf_Document_Create(&outDescriptor, &iConformance, NULL); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutDoc, _T("Output file \"%s\" cannot be created. %s (ErrorCode: 0x%08x).\n"), szOutPath, szErrorBuff, Ptx_GetLastError()); // ドキュメント全体のデータをコピー GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(copyDocumentData(pInDoc, pOutDoc), _T("Failed to copy document-wide data. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // コピーオプションを設定 pCopyOptions = PtxPdf_PageCopyOptions_New(); // 入力ページと出力ページのリストを取得 pInPageList = PtxPdf_Document_GetPages(pInDoc); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPageList, _T("Failed to get the pages of the input document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); pOutPageList = PtxPdf_Document_GetPages(pOutDoc); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPageList, _T("Failed to get the pages of the output document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // 先頭ページから選択されたページより前までをコピー pInPageRange = PtxPdf_PageList_GetRange(pInPageList, 0, iPageNumber - 1); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPageRange, _T("Failed to get page range. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); pOutPageRange = PtxPdf_PageList_Copy(pOutDoc, pInPageRange, pCopyOptions); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPageRange, _T("Failed to copy page range. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_PageList_AddRange(pOutPageList, pOutPageRange), _T("Failed to add page range. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); Ptx_Release(pInPageRange); pInPageRange = NULL; Ptx_Release(pOutPageRange); pOutPageRange = NULL; // 選択したページをコピーして画像を追加 pInPage = PtxPdf_PageList_Get(pInPageList, iPageNumber - 1); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPage, _T("Failed to get page. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); pOutPage = PtxPdf_Page_Copy(pOutDoc, pInPage, pCopyOptions); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPage, _T("Failed to copy page. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); if (addImage(pOutDoc, pOutPage, szImagePath, 150.0, 150.0) != 0) goto cleanup; GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_PageList_Add(pOutPageList, pOutPage), _T("Failed to add page. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // 残りのページをコピー pInPageRange = PtxPdf_PageList_GetRange(pInPageList, 1, PtxPdf_PageList_GetCount(pInPageList) - 1); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPageRange, _T("Failed to get page range from input document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); pOutPageRange = PtxPdf_PageList_Copy(pOutDoc, pInPageRange, pCopyOptions); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPageRange, _T("Failed to copy page range to output document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_PageList_AddRange(pOutPageList, pOutPageRange), _T("Failed to add page range to output page list. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError());
int copyDocumentData(TPtxPdf_Document* pInDoc, TPtxPdf_Document* pOutDoc) { TPtxPdf_FileReferenceList* pInFileRefList; TPtxPdf_FileReferenceList* pOutFileRefList; // 出力設定 if (PtxPdf_Document_GetOutputIntent(pInDoc) != NULL) if (PtxPdf_Document_SetOutputIntent(pOutDoc, PtxPdfContent_IccBasedColorSpace_Copy( pOutDoc, PtxPdf_Document_GetOutputIntent(pInDoc))) == FALSE) return FALSE; // メタデータ if (PtxPdf_Document_SetMetadata(pOutDoc, PtxPdf_Metadata_Copy(pOutDoc, PtxPdf_Document_GetMetadata(pInDoc))) == FALSE) return FALSE; // ビュワー設定 if (PtxPdf_Document_SetViewerSettings( pOutDoc, PtxPdfNav_ViewerSettings_Copy(pOutDoc, PtxPdf_Document_GetViewerSettings(pInDoc))) == FALSE) return FALSE; // 関連ファイル(PDF/A-3およびPDF 2.0のみ) pInFileRefList = PtxPdf_Document_GetAssociatedFiles(pInDoc); pOutFileRefList = PtxPdf_Document_GetAssociatedFiles(pOutDoc); if (pInFileRefList == NULL || pOutFileRefList == NULL) return FALSE; for (int iFileRef = 0; iFileRef < PtxPdf_FileReferenceList_GetCount(pInFileRefList); iFileRef++) if (PtxPdf_FileReferenceList_Add( pOutFileRefList, PtxPdf_FileReference_Copy(pOutDoc, PtxPdf_FileReferenceList_Get(pInFileRefList, iFileRef))) == FALSE) return FALSE; // プレーンな埋め込みファイル pInFileRefList = PtxPdf_Document_GetPlainEmbeddedFiles(pInDoc); pOutFileRefList = PtxPdf_Document_GetPlainEmbeddedFiles(pOutDoc); if (pInFileRefList == NULL || pOutFileRefList == NULL) return FALSE; for (int iFileRef = 0; iFileRef < PtxPdf_FileReferenceList_GetCount(pInFileRefList); iFileRef++) if (PtxPdf_FileReferenceList_Add( pOutFileRefList, PtxPdf_FileReference_Copy(pOutDoc, PtxPdf_FileReferenceList_Get(pInFileRefList, iFileRef))) == FALSE) return FALSE; return TRUE; }
int addImage(TPtxPdf_Document* pOutDoc, TPtxPdf_Page* pOutPage, TCHAR* szImagePath, double x, double y) { TPtxPdfContent_Content* pContent = NULL; TPtxPdfContent_ContentGenerator* pGenerator = NULL; TPtxSys_StreamDescriptor imageDescriptor; FILE* pImageStream = NULL; TPtxPdfContent_Image* pImage = NULL; pContent = PtxPdf_Page_GetContent(pOutPage); // コンテンツジェネレータを作成 pGenerator = PtxPdfContent_ContentGenerator_New(pContent, FALSE); // 入力パスからの画像読み込み pImageStream = _tfopen(szImagePath, _T("rb")); PtxSysCreateFILEStreamDescriptor(&imageDescriptor, pImageStream, 0); // 画像オブジェクトを作成 pImage = PtxPdfContent_Image_Create(pOutDoc, &imageDescriptor); double dResolution = 150.0; TPtxGeomInt_Size size; GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdfContent_Image_GetSize(pImage, &size), _T("Failed to get image size. %s(ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // データ行列の矩形を計算 TPtxGeomReal_Rectangle rect; rect.dLeft = x; rect.dBottom = y; rect.dRight = x + (double)size.iWidth * 72.0 / dResolution; rect.dTop = y + (double)size.iHeight * 72.0 / dResolution; // 指定されたに矩形画像を描画 GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdfContent_ContentGenerator_PaintImage(pGenerator, pImage, &rect), _T("Failed to paint image. %s(ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); cleanup: if (pGenerator != NULL) PtxPdfContent_ContentGenerator_Close(pGenerator); if (pContent != NULL) Ptx_Release(pContent); return iReturnValue; }
// 入力PDFを開く using (Stream inStream = new FileStream(inPath, FileMode.Open, FileAccess.Read)) using (Document inDoc = Document.Open(inStream, null)) // 出力PDFを作成 using (Stream outStream = new FileStream(outPath, FileMode.Create, FileAccess.ReadWrite)) using (Document outDoc = Document.Create(outStream, inDoc.Conformance, null)) { // ドキュメント全体のデータをコピー CopyDocumentData(inDoc, outDoc); // ページコピーオプションを定義 PageCopyOptions copyOptions = new PageCopyOptions(); // 先頭ページから選択したページの前までのページをコピーし、出力ドキュメントに追加 PageList inPageRange = inDoc.Pages.GetRange(0, pageNumber - 1); PageList copiedPages = PageList.Copy(outDoc, inPageRange, copyOptions); outDoc.Pages.AddRange(copiedPages); // 選択したページをコピーし、画像を追加して出力ドキュメントに追加 Page outPage = Page.Copy(outDoc, inDoc.Pages[pageNumber - 1], copyOptions); AddImage(outDoc, outPage, imagePath, 150, 150); outDoc.Pages.Add(outPage); // 残りのページをコピーして出力ドキュメントに追加 inPageRange = inDoc.Pages.GetRange(pageNumber, inDoc.Pages.Count - pageNumber); copiedPages = PageList.Copy(outDoc, inPageRange, copyOptions); outDoc.Pages.AddRange(copiedPages); }
private static void CopyDocumentData(Document inDoc, Document outDoc) { // ドキュメント全体のデータをコピー // 出力設定 if (inDoc.OutputIntent != null) outDoc.OutputIntent = IccBasedColorSpace.Copy(outDoc, inDoc.OutputIntent); // メタデータ outDoc.Metadata = Metadata.Copy(outDoc, inDoc.Metadata); // ビュワー設定 outDoc.ViewerSettings = ViewerSettings.Copy(outDoc, inDoc.ViewerSettings); // 関連ファイル(PDF/A-3およびPDF 2.0のみ) FileReferenceList outAssociatedFiles = outDoc.AssociatedFiles; foreach (FileReference inFileRef in inDoc.AssociatedFiles) outAssociatedFiles.Add(FileReference.Copy(outDoc, inFileRef)); // プレーンな埋め込みファイル FileReferenceList outEmbeddedFiles = outDoc.PlainEmbeddedFiles; foreach (FileReference inFileRef in inDoc.PlainEmbeddedFiles) outEmbeddedFiles.Add(FileReference.Copy(outDoc, inFileRef)); }
private static void AddImage(Document document, Page page, string imagePath, double x, double y) { // コンテンツジェネレータを作成 using ContentGenerator generator = new ContentGenerator(page.Content, false); // 入力パスからの画像読み込み using Stream inImage = new FileStream(imagePath, FileMode.Open, FileAccess.Read); // 画像オブジェクトを作成 Image image = Image.Create(document, inImage); double resolution = 150; // 画像の矩形を計算 PdfTools.Toolbox.Geometry.Integer.Size size = image.Size; Rectangle rect = new Rectangle { Left = x, Bottom = y, Right = x + size.Width * 72 / resolution, Top = y + size.Height * 72 / resolution }; // 指定された矩形に画像を描画 generator.PaintImage(image, rect); }
ページ上の指定した位置に長方形の画像マスクを配置します。
画像マスクは、画像をピクセル単位で塗りつぶしたりマスクしたりするステンシルマスクです。
// 入力PDFを開く pInStream = _tfopen(szInPath, _T("rb")); GOTO_CLEANUP_IF_NULL(pInStream, _T("Failed to open input file \"%s\".\n"), szInPath); PtxSysCreateFILEStreamDescriptor(&descriptor, pInStream, 0); pInDoc = PtxPdf_Document_Open(&descriptor, _T("")); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(_T("Input file \"%s\" cannot be opened. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // 出力PDFを作成 pOutStream = _tfopen(szOutPath, _T("wb+")); GOTO_CLEANUP_IF_NULL(pOutStream, _T("Failed to open output file \"%s\".\n"), szOutPath); PtxSysCreateFILEStreamDescriptor(&outDescriptor, pOutStream, 0); iConformance = PtxPdf_Document_GetConformance(pInDoc); pOutDoc = PtxPdf_Document_Create(&outDescriptor, &iConformance, NULL); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(_T("Output file \"%s\" cannot be created. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // ドキュメント全体のデータをコピー GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(copyDocumentData(pInDoc, pOutDoc), _T("Failed to copy document-wide data. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // デバイス色空間を取得 TPtxPdfContent_ColorSpace* pColorSpace = PtxPdfContent_ColorSpace_CreateProcessColorSpace(pOutDoc, ePtxPdfContent_ProcessColorSpaceType_Rgb); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pColorSpace, _T("Failed to get the device color space. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // RGBカラー値を選択 double color[] = {1.0, 0.0, 0.0}; size_t nColor = sizeof(color) / sizeof(double); // 描画オブジェクトを作成 pPaint = PtxPdfContent_Paint_Create(pOutDoc, pColorSpace, color, nColor, NULL); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pPaint, _T("Failed to create a transparent paint. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // コピーオプションを設定 pCopyOptions = PtxPdf_PageCopyOptions_New(); // 入力ページと出力ページのリストを取得 pInPageList = PtxPdf_Document_GetPages(pInDoc); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPageList, _T("Failed to get the pages of the input document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); pOutPageList = PtxPdf_Document_GetPages(pOutDoc); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPageList, _T("Failed to get the pages of the output document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // 最初のページをコピーして画像マスクを追加 pInPage = PtxPdf_PageList_Get(pInPageList, 0); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPage, _T("Failed to get page. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); pOutPage = PtxPdf_Page_Copy(pOutDoc, pInPage, pCopyOptions); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPage, _T("Failed to copy page. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); if (addImageMask(pOutDoc, pOutPage, szImageMaskPath, 250, 150) != 0) goto cleanup; GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_PageList_Add(pOutPageList, pOutPage), _T("Failed to add page. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // 残りのページをコピー pInPageRange = PtxPdf_PageList_GetRange(pInPageList, 1, PtxPdf_PageList_GetCount(pInPageList) - 1); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPageRange, _T("Failed to get page range from input document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); pOutPageRange = PtxPdf_PageList_Copy(pOutDoc, pInPageRange, pCopyOptions); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPageRange, _T("Failed to copy page range to output document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_PageList_AddRange(pOutPageList, pOutPageRange), _T("Failed to add page range to output page list. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError());
int copyDocumentData(TPtxPdf_Document* pInDoc, TPtxPdf_Document* pOutDoc) { TPtxPdf_FileReferenceList* pInFileRefList; TPtxPdf_FileReferenceList* pOutFileRefList; // 出力設定 if (PtxPdf_Document_GetOutputIntent(pInDoc) != NULL) if (PtxPdf_Document_SetOutputIntent(pOutDoc, PtxPdfContent_IccBasedColorSpace_Copy( pOutDoc, PtxPdf_Document_GetOutputIntent(pInDoc))) == FALSE) return FALSE; // メタデータ if (PtxPdf_Document_SetMetadata(pOutDoc, PtxPdf_Metadata_Copy(pOutDoc, PtxPdf_Document_GetMetadata(pInDoc))) == FALSE) return FALSE; // ビュワー設定 if (PtxPdf_Document_SetViewerSettings( pOutDoc, PtxPdfNav_ViewerSettings_Copy(pOutDoc, PtxPdf_Document_GetViewerSettings(pInDoc))) == FALSE) return FALSE; // 関連ファイル (PDF/A-3およびPDF2.0のみ) pInFileRefList = PtxPdf_Document_GetAssociatedFiles(pInDoc); pOutFileRefList = PtxPdf_Document_GetAssociatedFiles(pOutDoc); if (pInFileRefList == NULL || pOutFileRefList == NULL) return FALSE; for (int iFileRef = 0; iFileRef < PtxPdf_FileReferenceList_GetCount(pInFileRefList); iFileRef++) if (PtxPdf_FileReferenceList_Add( pOutFileRefList, PtxPdf_FileReference_Copy(pOutDoc, PtxPdf_FileReferenceList_Get(pInFileRefList, iFileRef))) == FALSE) return FALSE; // プレーンな埋め込みファイル pInFileRefList = PtxPdf_Document_GetPlainEmbeddedFiles(pInDoc); pOutFileRefList = PtxPdf_Document_GetPlainEmbeddedFiles(pOutDoc); if (pInFileRefList == NULL || pOutFileRefList == NULL) return FALSE; for (int iFileRef = 0; iFileRef < PtxPdf_FileReferenceList_GetCount(pInFileRefList); iFileRef++) if (PtxPdf_FileReferenceList_Add( pOutFileRefList, PtxPdf_FileReference_Copy(pOutDoc, PtxPdf_FileReferenceList_Get(pInFileRefList, iFileRef))) == FALSE) return FALSE; return TRUE; }
int addImageMask(TPtxPdf_Document* pOutDoc, TPtxPdf_Page* pOutPage, TCHAR* szImageMaskPath, double x, double y) { TPtxPdfContent_Content* pContent = NULL; TPtxPdfContent_ContentGenerator* pGenerator = NULL; FILE* pImageStream = NULL; TPtxSys_StreamDescriptor imageDescriptor; TPtxPdfContent_ImageMask* pImageMask = NULL; pContent = PtxPdf_Page_GetContent(pOutPage); // コンテンツジェネレータを作成 pGenerator = PtxPdfContent_ContentGenerator_New(pContent, FALSE); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pGenerator, _T("Failed to create a content generator. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // 入力パスからの画像読み込み pImageStream = _tfopen(szImageMaskPath, _T("rb")); GOTO_CLEANUP_IF_NULL(pImageStream, _T("Failed to open image mask file \"%s\".\n"), szImageMaskPath); PtxSysCreateFILEStreamDescriptor(&imageDescriptor, pImageStream, 0); // 画像マスクオブジェクトを作成 pImageMask = PtxPdfContent_ImageMask_Create(pOutDoc, &imageDescriptor); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pImageMask, _T("Failed to create image mask obejct. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); double dResolution = 150.0; TPtxGeomInt_Size size; GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdfContent_ImageMask_GetSize(pImageMask, &size), _T("Failed to get image mask size. %s(ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // データ行列の矩形を計算 TPtxGeomReal_Rectangle rect; rect.dLeft = x; rect.dBottom = y; rect.dRight = x + (double)size.iWidth * 72.0 / dResolution; rect.dTop = y + (double)size.iHeight * 72.0 / dResolution; // 指定された矩形に画像マスクを描画 GOTO_CLEANUP_IF_FALSE_PRINT_ERROR( PtxPdfContent_ContentGenerator_PaintImageMask(pGenerator, pImageMask, &rect, pPaint), _T("Failed to paint image mask. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); cleanup: if (pGenerator != NULL) PtxPdfContent_ContentGenerator_Close(pGenerator); if (pContent != NULL) Ptx_Release(pContent); return iReturnValue; }
// 入力PDFを開く using (Stream inStream = new FileStream(inPath, FileMode.Open, FileAccess.Read)) using (Document inDoc = Document.Open(inStream, null)) // 出力PDFを作成 using (Stream outStream = new FileStream(outPath, FileMode.Create, FileAccess.ReadWrite)) using (Document outDoc = Document.Create(outStream, inDoc.Conformance, null)) { // ドキュメント全体のデータをコピー CopyDocumentData(inDoc, outDoc); // デバイス色空間を取得 ColorSpace colorSpace = ColorSpace.CreateProcessColorSpace(outDoc, ProcessColorSpaceType.Rgb); // 描画オブジェクトを作成 paint = Paint.Create(outDoc, colorSpace, new double[] { 1.0, 0.0, 0.0 }, null); // ページのコピーオプションを定義 PageCopyOptions copyOptions = new PageCopyOptions(); // 最初のページをコピーし、画像マスクを追加して出力ドキュメントに追加 Page outPage = Page.Copy(outDoc, inDoc.Pages[0], copyOptions); AddImageMask(outDoc, outPage, imageMaskPath, 250, 150); outDoc.Pages.Add(outPage); // 残りのページをコピーして出力ドキュメントに追加 PageList inPageRange = inDoc.Pages.GetRange(1, inDoc.Pages.Count - 1); PageList copiedPages = PageList.Copy(outDoc, inPageRange, copyOptions); outDoc.Pages.AddRange(copiedPages); }
private static void CopyDocumentData(Document inDoc, Document outDoc) { // ドキュメント全体のデータをコピー // 出力設定 if (inDoc.OutputIntent != null) outDoc.OutputIntent = IccBasedColorSpace.Copy(outDoc, inDoc.OutputIntent); // メタデータ outDoc.Metadata = Metadata.Copy(outDoc, inDoc.Metadata); // ビュワー設定 outDoc.ViewerSettings = ViewerSettings.Copy(outDoc, inDoc.ViewerSettings); // 関連ファイル (PDF/A-3およびPDF2.0のみ) FileReferenceList outAssociatedFiles = outDoc.AssociatedFiles; foreach (FileReference inFileRef in inDoc.AssociatedFiles) outAssociatedFiles.Add(FileReference.Copy(outDoc, inFileRef)); // プレーンな埋め込みファイル FileReferenceList outEmbeddedFiles = outDoc.PlainEmbeddedFiles; foreach (FileReference inFileRef in inDoc.PlainEmbeddedFiles) outEmbeddedFiles.Add(FileReference.Copy(outDoc, inFileRef)); }
private static void AddImageMask(Document document, Page outPage, string imagePath, double x, double y) { // コンテンツジェネレータを作成 using ContentGenerator generator = new ContentGenerator(outPage.Content, false); // 入力パスからの画像読み込み using Stream inImage = new FileStream(imagePath, FileMode.Open, FileAccess.Read); // 画像マスクオブジェクトを作成 ImageMask imageMask = ImageMask.Create(document, inImage); double resolution = 150; // 画像の矩形を計算 PdfTools.Toolbox.Geometry.Integer.Size size = imageMask.Size; Rectangle rect = new Rectangle { Left = x, Bottom = y, Right = x + size.Width * 72 / resolution, Top = y + size.Height * 72 / resolution }; // 指定された四角形に画像マスクを描画 generator.PaintImageMask(imageMask, rect, paint); }
既存PDFのページに線を描画します。
// 入力PDFを開く pInStream = _tfopen(szInPath, _T("rb")); GOTO_CLEANUP_IF_NULL(pInStream, _T("Failed to open input file \"%s\".\n"), szInPath); PtxSysCreateFILEStreamDescriptor(&descriptor, pInStream, 0); pInDoc = PtxPdf_Document_Open(&descriptor, _T("")); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInDoc, _T("Input file \"%s\" cannot cannot be opened. %s (ErrorCode: 0x%08x).\n"), szInPath, szErrorBuff, Ptx_GetLastError()); // 出力PDFを作成 pOutStream = _tfopen(szOutPath, _T("wb+")); GOTO_CLEANUP_IF_NULL(pOutStream, _T("Failed to open output file \"%s\".\n"), szOutPath); PtxSysCreateFILEStreamDescriptor(&outDescriptor, pOutStream, 0); iConformance = PtxPdf_Document_GetConformance(pInDoc); pOutDoc = PtxPdf_Document_Create(&outDescriptor, &iConformance, NULL); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutDoc, _T("Output file \"%s\" cannot be created. %s (ErrorCode: 0x%08x).\n"), szOutPath, szErrorBuff, Ptx_GetLastError()); // ドキュメント全体のデータをコピー GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(copyDocumentData(pInDoc, pOutDoc), _T("Failed to copy document-wide data. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // コピーオプションを設定 pCopyOptions = PtxPdf_PageCopyOptions_New(); // 入力の全ページを繰り返す pInPageList = PtxPdf_Document_GetPages(pInDoc); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPageList, _T("Failed to get the pages of the input document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); pOutPageList = PtxPdf_Document_GetPages(pOutDoc); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPageList, _T("Failed to get the pages of the output document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); for (int iPage = 1; iPage <= PtxPdf_PageList_GetCount(pInPageList); iPage++) { pInPage = PtxPdf_PageList_Get(pInPageList, iPage - 1); // 入力から出力にページをコピー pOutPage = PtxPdf_Page_Copy(pOutDoc, pInPage, pCopyOptions); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPage, _T("Failed to copy pages from input to output. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); PtxPdf_Page_GetSize(pOutPage, &size); // 先頭のページにテキストを追加 if (addLine(pOutDoc, pOutPage) == 1) { goto cleanup; } // 出力ドキュメントにページを追加 GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_PageList_Add(pOutPageList, pOutPage), _T("Failed to add page to output document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); if (pOutPage != NULL) { Ptx_Release(pOutPage); pOutPage = NULL; } if (pInPage != NULL) { Ptx_Release(pInPage); pInPage = NULL; } }
int copyDocumentData(TPtxPdf_Document* pInDoc, TPtxPdf_Document* pOutDoc) { TPtxPdf_FileReferenceList* pInFileRefList; TPtxPdf_FileReferenceList* pOutFileRefList; // 出力設定 if (PtxPdf_Document_GetOutputIntent(pInDoc) != NULL) if (PtxPdf_Document_SetOutputIntent(pOutDoc, PtxPdfContent_IccBasedColorSpace_Copy( pOutDoc, PtxPdf_Document_GetOutputIntent(pInDoc))) == FALSE) return FALSE; // メタデータ if (PtxPdf_Document_SetMetadata(pOutDoc, PtxPdf_Metadata_Copy(pOutDoc, PtxPdf_Document_GetMetadata(pInDoc))) == FALSE) return FALSE; // ビュワー設定 if (PtxPdf_Document_SetViewerSettings( pOutDoc, PtxPdfNav_ViewerSettings_Copy(pOutDoc, PtxPdf_Document_GetViewerSettings(pInDoc))) == FALSE) return FALSE; // 関連ファイル (PDF/A-3およびPDF 2.0のみ) pInFileRefList = PtxPdf_Document_GetAssociatedFiles(pInDoc); pOutFileRefList = PtxPdf_Document_GetAssociatedFiles(pOutDoc); if (pInFileRefList == NULL || pOutFileRefList == NULL) return FALSE; for (int iFileRef = 0; iFileRef < PtxPdf_FileReferenceList_GetCount(pInFileRefList); iFileRef++) if (PtxPdf_FileReferenceList_Add( pOutFileRefList, PtxPdf_FileReference_Copy(pOutDoc, PtxPdf_FileReferenceList_Get(pInFileRefList, iFileRef))) == FALSE) return FALSE; // プレーンな埋め込みファイル pInFileRefList = PtxPdf_Document_GetPlainEmbeddedFiles(pInDoc); pOutFileRefList = PtxPdf_Document_GetPlainEmbeddedFiles(pOutDoc); if (pInFileRefList == NULL || pOutFileRefList == NULL) return FALSE; for (int iFileRef = 0; iFileRef < PtxPdf_FileReferenceList_GetCount(pInFileRefList); iFileRef++) if (PtxPdf_FileReferenceList_Add( pOutFileRefList, PtxPdf_FileReference_Copy(pOutDoc, PtxPdf_FileReferenceList_Get(pInFileRefList, iFileRef))) == FALSE) return FALSE; return TRUE; }
int addLine(TPtxPdf_Document* pOutDoc, TPtxPdf_Page* pOutPage) { TPtxPdfContent_Content* pContent = NULL; TPtxPdfContent_ContentGenerator* pGenerator = NULL; TPtxPdfContent_Path* pPath = NULL; TPtxPdfContent_PathGenerator* pPathGenerator = NULL; TPtxPdfContent_ColorSpace* pDeviceRgbColorSpace = NULL; double aColor[3]; TPtxPdfContent_Paint* pPaint = NULL; TPtxPdfContent_Stroke* pStroke; TPtxGeomReal_Size pageSize; TPtxGeomReal_Point point; pContent = PtxPdf_Page_GetContent(pOutPage); PtxPdf_Page_GetSize(pOutPage, &pageSize); // コンテンツジェネレータを作成 pGenerator = PtxPdfContent_ContentGenerator_New(pContent, FALSE); GOTO_CLEANUP_IF_NULL(pGenerator, szErrorBuff, Ptx_GetLastError()); // パス(ベクターグラフィック)を作成 pPath = PtxPdfContent_Path_New(); GOTO_CLEANUP_IF_NULL(pPath, szErrorBuff, Ptx_GetLastError()); // パスジェネレータを作成 pPathGenerator = PtxPdfContent_PathGenerator_New(pPath); GOTO_CLEANUP_IF_NULL(pPathGenerator, szErrorBuff, Ptx_GetLastError()); // ページ全体に斜めの線を描画 point.dX = 10.0; point.dY = 10.0; GOTO_CLEANUP_IF_FALSE(PtxPdfContent_PathGenerator_MoveTo(pPathGenerator, &point), szErrorBuff, Ptx_GetLastError()); point.dX = pageSize.dWidth - 10.0; point.dY = pageSize.dHeight - 10.0; GOTO_CLEANUP_IF_FALSE(PtxPdfContent_PathGenerator_LineTo(pPathGenerator, &point), szErrorBuff, Ptx_GetLastError()); // パスを終了するためにパスジェネレーターを閉じる PtxPdfContent_PathGenerator_Close(pPathGenerator); pPathGenerator = NULL; // RGBカラースペースを作成 pDeviceRgbColorSpace = PtxPdfContent_ColorSpace_CreateProcessColorSpace(pOutDoc, ePtxPdfContent_ProcessColorSpaceType_Rgb); GOTO_CLEANUP_IF_NULL(pDeviceRgbColorSpace, szErrorBuff, Ptx_GetLastError()); // 赤色で初期化 aColor[0] = 1.0; aColor[1] = 0.0; aColor[2] = 0.0; // 描画オブジェクトを作成 pPaint = PtxPdfContent_Paint_Create(pOutDoc, pDeviceRgbColorSpace, aColor, sizeof(aColor) / sizeof(aColor[0]), NULL); GOTO_CLEANUP_IF_NULL(pPaint, szErrorBuff, Ptx_GetLastError()); // 指定されたペイントと線幅でストロークパラメータを設定 pStroke = PtxPdfContent_Stroke_New(pPaint, 10.0); GOTO_CLEANUP_IF_NULL(pStroke, szErrorBuff, Ptx_GetLastError()); // ページにパスを描画 GOTO_CLEANUP_IF_FALSE(PtxPdfContent_ContentGenerator_PaintPath(pGenerator, pPath, NULL, pStroke), szErrorBuff, Ptx_GetLastError()); cleanup: if (pPathGenerator != NULL) PtxPdfContent_PathGenerator_Close(pPathGenerator); if (pGenerator != NULL) PtxPdfContent_ContentGenerator_Close(pGenerator); if (pContent != NULL) Ptx_Release(pContent); return iReturnValue; }
// 入力PDFを開く using (System.IO.Stream inStream = new System.IO.FileStream(inPath, System.IO.FileMode.Open, System.IO.FileAccess.Read)) using (Document inDoc = Document.Open(inStream, null)) // 出力PDFを作成 using (System.IO.Stream outStream = new System.IO.FileStream(outPath, System.IO.FileMode.Create, System.IO.FileAccess.ReadWrite)) using (Document outDoc = Document.Create(outStream, inDoc.Conformance, null)) { // ドキュメント全体のデータをコピー CopyDocumentData(inDoc, outDoc); // ページコピーオプションを定義 PageCopyOptions copyOptions = new PageCopyOptions(); // 入力PDFからすべてのページをコピー foreach (Page inPage in inDoc.Pages) { Page outPage = Page.Copy(outDoc, inPage, copyOptions); // 線分をページに描画 AddLine(outDoc, outPage); // ページを出力PDFに追加 outDoc.Pages.Add(outPage); } }
private static void CopyDocumentData(Document inDoc, Document outDoc) { // ドキュメント全体のデータをコピー // 出力設定 if (inDoc.OutputIntent != null) outDoc.OutputIntent = IccBasedColorSpace.Copy(outDoc, inDoc.OutputIntent); // メタデータ outDoc.Metadata = Metadata.Copy(outDoc, inDoc.Metadata); // ビュワー設定 outDoc.ViewerSettings = ViewerSettings.Copy(outDoc, inDoc.ViewerSettings); // 関連ファイル (PDF/A-3およびPDF2.0のみ) FileReferenceList outAssociatedFiles = outDoc.AssociatedFiles; foreach (FileReference inFileRef in inDoc.AssociatedFiles) outAssociatedFiles.Add(FileReference.Copy(outDoc, inFileRef)); // プレーンな埋め込みファイル FileReferenceList outEmbeddedFiles = outDoc.PlainEmbeddedFiles; foreach (FileReference inFileRef in inDoc.PlainEmbeddedFiles) outEmbeddedFiles.Add(FileReference.Copy(outDoc, inFileRef)); }
private static void AddLine(Document document, Page page) { // コンテンツジェネレータを作成 using ContentGenerator generator = new ContentGenerator(page.Content, false); // パス(ベクターグラフィック)を作成 Path path = new Path(); using (PathGenerator pathGenerator = new PathGenerator(path)) { // ページ全体に斜めの線を描画 Size pageSize = page.Size; pathGenerator.MoveTo(new Point() { X = 10.0, Y = 10.0 }); pathGenerator.LineTo(new Point() { X = pageSize.Width - 10.0, Y = pageSize.Height - 10.0 }); } // RGBカラースペースを作成 ColorSpace deviceRgbColorSpace = ColorSpace.CreateProcessColorSpace(document, ProcessColorSpaceType.Rgb); // 赤色を作成 double[] color = new double[] { 1.0, 0.0, 0.0 }; // ペイントオブジェクトを作成 Paint paint = Paint.Create(document, deviceRgbColorSpace, color, null); // 指定されたペイントと線幅でストロークパラメータを作成 Stroke stroke = new Stroke(paint, 10.0); // ページにパスを描画 generator.PaintPath(path, null, stroke); }
質問のページからお送りいただくようお願いします。
または、メールでsupport@trustss.co.jpあてにお送りください。
ご購入前の技術的質問も無償で対応します。サポート受付ページからお願いします。