印刷に適したレイアウトのPDFを作成できます。
フォームフィールドをフラット化したり、ページサイズやページの向きを設定したり、複数のページを1ページに配置したりできます。
Toolbox Add-onのAPIリファレンスはこちらです。(すべて英文)
C#のサンプルプロジェクトではPdftools SDK(Toolbox Add-on)ライブラリ(DLL)をNuGetから自動でダウンロードします。
CのサンプルプロジェクトにはPdftools SDK(Toolbox Add-on)ライブラリ(DLL)が含まれています。
ライセンスキー無し(無償)で試用できます。ただし、結果に「透かし」が入ります。
「透かし」の削除をご希望の場合は問い合わせページまたはメールでお問い合わせください。
License Agreement(利用許諾契約書)が含まれていますので必ず確認してください。
このプロジェクトでは、フォームフィールドをその視覚的な外観を維持しながら非インタラクティブなコンテンツに変換します。
フォーム フィールドの外観をフラット化し、すべてのインタラクティブな要素を破棄します。
// Open input document 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()); // Create output document 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()); // Copy document-wide data GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(copyDocumentData(pInDoc, pOutDoc), _T("Failed to copy document-wide data. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // Configure copy options: enable form field flattening pCopyOptions = PtxPdf_PageCopyOptions_New(); PtxPdf_PageCopyOptions_SetFormFields(pCopyOptions, ePtxPdfForms_FormFieldCopyStrategy_Flatten); // Copy all pages pInPageList = PtxPdf_Document_GetPages(pInDoc); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPageList, _T("Failed to get pages of the input document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); pCopiedPages = PtxPdf_PageList_Copy(pOutDoc, pInPageList, pCopyOptions); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pCopiedPages, _T("Failed to copy pages. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // Add copied pages to output pOutPageList = PtxPdf_Document_GetPages(pOutDoc); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPageList, _T("Failed to get pages of the output document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_PageList_AddRange(pOutPageList, pCopiedPages), _T("Failed to add copied pages to output. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError());
int copyDocumentData(TPtxPdf_Document* pInDoc, TPtxPdf_Document* pOutDoc) { TPtxPdf_FileReferenceList* pInFileRefList; TPtxPdf_FileReferenceList* pOutFileRefList; // Output intent if (PtxPdf_Document_GetOutputIntent(pInDoc) != NULL) if (PtxPdf_Document_SetOutputIntent(pOutDoc, PtxPdfContent_IccBasedColorSpace_Copy( pOutDoc, PtxPdf_Document_GetOutputIntent(pInDoc))) == FALSE) return FALSE; // Metadata if (PtxPdf_Document_SetMetadata(pOutDoc, PtxPdf_Metadata_Copy(pOutDoc, PtxPdf_Document_GetMetadata(pInDoc))) == FALSE) return FALSE; // Viewer settings if (PtxPdf_Document_SetViewerSettings( pOutDoc, PtxPdfNav_ViewerSettings_Copy(pOutDoc, PtxPdf_Document_GetViewerSettings(pInDoc))) == FALSE) return FALSE; // Associated files (for PDF/A-3 and PDF 2.0 only) 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; // Plain embedded files 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; }
// Open input document 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)) { // Copy document-wide data CopyDocumentData(inDoc, outDoc); // Define copy options including form field flattening PageCopyOptions copyOptions = new PageCopyOptions(); copyOptions.FormFields = FormFieldCopyStrategy.Flatten; // Copy all pages and append to output document PageList copiedPages = PageList.Copy(outDoc, inDoc.Pages, copyOptions); outDoc.Pages.AddRange(copiedPages); }
private static void CopyDocumentData(Document inDoc, Document outDoc) { // Copy document-wide data // Output intent if (inDoc.OutputIntent != null) outDoc.OutputIntent = IccBasedColorSpace.Copy(outDoc, inDoc.OutputIntent); // Metadata outDoc.Metadata = Metadata.Copy(outDoc, inDoc.Metadata); // Viewer settings outDoc.ViewerSettings = ViewerSettings.Copy(outDoc, inDoc.ViewerSettings); // Associated files (for PDF/A-3 and PDF 2.0 only) FileReferenceList outAssociatedFiles = outDoc.AssociatedFiles; foreach (FileReference inFileRef in inDoc.AssociatedFiles) outAssociatedFiles.Add(FileReference.Copy(outDoc, inFileRef)); // Plain embedded files FileReferenceList outEmbeddedFiles = outDoc.PlainEmbeddedFiles; foreach (FileReference inFileRef in inDoc.PlainEmbeddedFiles) outEmbeddedFiles.Add(FileReference.Copy(outDoc, inFileRef)); }
このプロジェクトでは、ページの向きを検出し、目的のページ形式に適合しない場合は自動的に回転および拡大縮小します。
PDFの各ページを指定されたのページ形式に適合させます。
// Open input document 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()); // Create output document 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()); // Copy document-wide data GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(copyDocumentData(pInDoc, pOutDoc), _T("Failed to copy document-wide data. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // Configure copy options pCopyOptions = PtxPdf_PageCopyOptions_New(); // Copy all pages pInPageList = PtxPdf_Document_GetPages(pInDoc); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPageList, _T("Failed to get 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 pages of the output document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); for (int iPage = 0; iPage < PtxPdf_PageList_GetCount(pInPageList); iPage++) { TPtxGeomReal_Size pageSize; TPtxGeomReal_Size rotatedSize; BOOL bRotate; pInPage = PtxPdf_PageList_Get(pInPageList, iPage); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pInPage, _T("%s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); pOutPage = NULL; GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_Page_GetSize(pInPage, &pageSize), _T("%s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); bRotate = bAllowRotate && (pageSize.dHeight >= pageSize.dWidth) != (targetSize.dHeight >= targetSize.dWidth); if (bRotate) { rotatedSize.dWidth = pageSize.dHeight; rotatedSize.dHeight = pageSize.dHeight; } else { rotatedSize = pageSize; } if (rotatedSize.dWidth == targetSize.dWidth && rotatedSize.dHeight == targetSize.dWidth) { // If size is correct, copy page only 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()); if (bRotate) { GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_Page_Rotate(pOutPage, ePtxGeom_Rotation_Clockwise), _T("Failed to rotate page. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); } } else { TPtxPdfContent_Group* pGroup = NULL; TPtxPdfContent_Content* pContent = NULL; TPtxGeomReal_AffineTransform transform; TPtxGeomReal_Point position; TPtxGeomReal_Point point; // Create a new page of correct size and fit existing page onto it pOutPage = PtxPdf_Page_Create(pOutDoc, &targetSize); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPage, _T("Failed to create a new page. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // Copy page as group pGroup = PtxPdfContent_Group_CopyFromPage(pOutDoc, pInPage, pCopyOptions); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pGroup, _T("Failed to copy page as group. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // Calculate scaling and position of group double scale = MIN(targetSize.dWidth / rotatedSize.dWidth, targetSize.dHeight / rotatedSize.dHeight); // Calculate position position.dX = (targetSize.dWidth - pageSize.dWidth * scale) / 2; position.dY = (targetSize.dHeight - pageSize.dHeight * scale) / 2; pContent = PtxPdf_Page_GetContent(pOutPage); // Create content generator 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()); // Calculate and apply transformation GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxGeomReal_AffineTransform_GetIdentity(&transform), _T("%s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); GOTO_CLEANUP_IF_FALSE_PRINT_ERROR( PtxGeomReal_AffineTransform_Translate(&transform, position.dX, position.dY), _T("%s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxGeomReal_AffineTransform_Scale(&transform, scale, scale), _T("%s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); point.dX = pageSize.dWidth / 2.0; point.dY = pageSize.dHeight / 2.0; // Rotate input file if (bRotate) { GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxGeomReal_AffineTransform_Rotate(&transform, 90, &point), _T("%s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); } GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdfContent_ContentGenerator_Transform(pGenerator, &transform), _T("%s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // Paint form GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdfContent_ContentGenerator_PaintGroup(pGenerator, pGroup, NULL, NULL), _T("Failed to paint the group. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); PtxPdfContent_ContentGenerator_Close(pGenerator); pGenerator = NULL; if (pGenerator != NULL) Ptx_Release(pGenerator); if (pGroup != NULL) Ptx_Release(pGroup); } // Add page to output document 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; // Output intent if (PtxPdf_Document_GetOutputIntent(pInDoc) != NULL) if (PtxPdf_Document_SetOutputIntent(pOutDoc, PtxPdfContent_IccBasedColorSpace_Copy( pOutDoc, PtxPdf_Document_GetOutputIntent(pInDoc))) == FALSE) return FALSE; // Metadata if (PtxPdf_Document_SetMetadata(pOutDoc, PtxPdf_Metadata_Copy(pOutDoc, PtxPdf_Document_GetMetadata(pInDoc))) == FALSE) return FALSE; // Viewer settings if (PtxPdf_Document_SetViewerSettings( pOutDoc, PtxPdfNav_ViewerSettings_Copy(pOutDoc, PtxPdf_Document_GetViewerSettings(pInDoc))) == FALSE) return FALSE; // Associated files (for PDF/A-3 and PDF 2.0 only) 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; // Plain embedded files 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; }
// Open input document 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)) { // Copy document-wide data CopyDocumentData(inDoc, outDoc); // Define page copy options PageCopyOptions copyOptions = new PageCopyOptions(); // Copy pages foreach (Page inPage in inDoc.Pages) { Page outPage = null; Size pageSize = inPage.Size; bool rotate = AllowRotate && (pageSize.Height >= pageSize.Width) != (TargetSize.Height >= TargetSize.Width); Size rotatedSize = pageSize; if (rotate) rotatedSize = new Size { Width = pageSize.Height, Height = pageSize.Width }; if (rotatedSize.Width == TargetSize.Width && rotatedSize.Height == TargetSize.Width) { // If size is correct, copy page only outPage = Page.Copy(outDoc, inPage, copyOptions); if (rotate) outPage.Rotate(Rotation.Clockwise); } else { // Create new page of correct size and fit existing page onto it outPage = Page.Create(outDoc, TargetSize); // Copy page as group Group group = Group.CopyFromPage(outDoc, inPage, copyOptions); // Calculate scaling and position of group double scale = Math.Min(TargetSize.Width / rotatedSize.Width, TargetSize.Height / rotatedSize.Height); // Calculate position Point position = new Point { X = (TargetSize.Width - pageSize.Width * scale) / 2, Y = (TargetSize.Height - pageSize.Height * scale) / 2 }; // Create content generator using ContentGenerator generator = new ContentGenerator(outPage.Content, false); // Calculate and apply transformation AffineTransform transform = AffineTransform.Identity; transform.Translate(position.X, position.Y); transform.Scale(scale, scale); Point point = new Point() { X = pageSize.Width / 2.0, Y = pageSize.Height / 2.0 }; // Rotate input file if (rotate) transform.Rotate(90, point); generator.Transform(transform); // Paint group generator.PaintGroup(group, null, null); } // Add page to output document outDoc.Pages.Add(outPage); } }
private static void CopyDocumentData(Document inDoc, Document outDoc) { // Copy document-wide data // Output intent if (inDoc.OutputIntent != null) outDoc.OutputIntent = IccBasedColorSpace.Copy(outDoc, inDoc.OutputIntent); // Metadata outDoc.Metadata = Metadata.Copy(outDoc, inDoc.Metadata); // Viewer settings outDoc.ViewerSettings = ViewerSettings.Copy(outDoc, inDoc.ViewerSettings); // Associated files (for PDF/A-3 and PDF 2.0 only) FileReferenceList outAssociatedFiles = outDoc.AssociatedFiles; foreach (FileReference inFileRef in inDoc.AssociatedFiles) outAssociatedFiles.Add(FileReference.Copy(outDoc, inFileRef)); // Plain embedded files FileReferenceList outEmbeddedFiles = outDoc.PlainEmbeddedFiles; foreach (FileReference inFileRef in inDoc.PlainEmbeddedFiles) outEmbeddedFiles.Add(FileReference.Copy(outDoc, inFileRef)); }
PDFの指定されたページを90度回転します。
// Open input document 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()); // Create output document 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()); // Copy document-wide data GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(copyDocumentData(pInDoc, pOutDoc), _T("Failed to copy document-wide data. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // Configure copy options pCopyOptions = PtxPdf_PageCopyOptions_New(); // Copy all pages 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()); pCopiedPages = PtxPdf_PageList_Copy(pOutDoc, pInPageList, pCopyOptions); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pCopiedPages, _T("Failed to copy pages. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // Rotate given pages by 90 degrees for (int i = 0; i < ARRAY_SIZE(aPageNumbers); i++) { pOutPage = PtxPdf_PageList_Get(pCopiedPages, aPageNumbers[i] - 1); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPage, _T("Failed to get copied page. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_Page_Rotate(pOutPage, ePtxGeom_Rotation_Clockwise), _T("Failed to rotate page. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); } // Add pages to output document pOutPageList = PtxPdf_Document_GetPages(pOutDoc); GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdf_PageList_AddRange(pOutPageList, pCopiedPages), _T("Failed to add copied pages. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError());
int copyDocumentData(TPtxPdf_Document* pInDoc, TPtxPdf_Document* pOutDoc) { TPtxPdf_FileReferenceList* pInFileRefList; TPtxPdf_FileReferenceList* pOutFileRefList; // Output intent if (PtxPdf_Document_GetOutputIntent(pInDoc) != NULL) if (PtxPdf_Document_SetOutputIntent(pOutDoc, PtxPdfContent_IccBasedColorSpace_Copy( pOutDoc, PtxPdf_Document_GetOutputIntent(pInDoc))) == FALSE) return FALSE; // Metadata if (PtxPdf_Document_SetMetadata(pOutDoc, PtxPdf_Metadata_Copy(pOutDoc, PtxPdf_Document_GetMetadata(pInDoc))) == FALSE) return FALSE; // Viewer settings if (PtxPdf_Document_SetViewerSettings( pOutDoc, PtxPdfNav_ViewerSettings_Copy(pOutDoc, PtxPdf_Document_GetViewerSettings(pInDoc))) == FALSE) return FALSE; // Associated files (for PDF/A-3 and PDF 2.0 only) 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; // Plain embedded files 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; }
// Open input document using (Stream inStream = new FileStream(inPath, FileMode.Open, FileAccess.Read)) using (Document inDoc = Document.Open(inStream, null)) // Create output document using (Stream outFs = new FileStream(outPath, FileMode.Create, FileAccess.ReadWrite)) using (Document outDoc = Document.Create(outFs, inDoc.Conformance, null)) { // Copy document-wide data CopyDocumentData(inDoc, outDoc); // Define page copy options PageCopyOptions copyOptions = new PageCopyOptions(); // Copy all pages PageList copiedPages = PageList.Copy(outDoc, inDoc.Pages, copyOptions); // Rotate selected pages by 90 degrees foreach (var pageNumber in pageNumbers) { copiedPages[pageNumber - 1].Rotate(Rotation.Clockwise); } // Add pages to output document outDoc.Pages.AddRange(copiedPages); }
private static void CopyDocumentData(Document inDoc, Document outDoc) { // Copy document-wide data // Output intent if (inDoc.OutputIntent != null) outDoc.OutputIntent = IccBasedColorSpace.Copy(outDoc, inDoc.OutputIntent); // Metadata outDoc.Metadata = Metadata.Copy(outDoc, inDoc.Metadata); // Viewer settings outDoc.ViewerSettings = ViewerSettings.Copy(outDoc, inDoc.ViewerSettings); // Associated files (for PDF/A-3 and PDF 2.0 only) FileReferenceList outAssociatedFiles = outDoc.AssociatedFiles; foreach (FileReference inFileRef in inDoc.AssociatedFiles) outAssociatedFiles.Add(FileReference.Copy(outDoc, inFileRef)); // Plain embedded files FileReferenceList outEmbeddedFiles = outDoc.PlainEmbeddedFiles; foreach (FileReference inFileRef in inDoc.PlainEmbeddedFiles) outEmbeddedFiles.Add(FileReference.Copy(outDoc, inFileRef)); }
PDF4ページを単一ページに配置します。
// Open input document 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()); // Create output document 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()); // Copy document-wide data GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(copyDocumentData(pInDoc, pOutDoc), _T("Failed to copy document-wide data. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // Configure copy options pCopyOptions = PtxPdf_PageCopyOptions_New(); // Copy all pages 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 pages of the output document. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); int nPageCount = 0; for (int iPage = 0; iPage < PtxPdf_PageList_GetCount(pInPageList); iPage++) { pInPage = PtxPdf_PageList_Get(pInPageList, iPage); if (nPageCount == nNx * nNy) { // Add to output document PtxPdfContent_ContentGenerator_Close(pGenerator); 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()); Ptx_Release(pOutPage); pOutPage = NULL; nPageCount = 0; } if (pOutPage == NULL) { // Create a new output page pOutPage = PtxPdf_Page_Create(pOutDoc, &PageSize); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pOutPage, _T("Failed to create a new output page. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); TPtxPdfContent_Content* pContent = PtxPdf_Page_GetContent(pOutPage); pGenerator = PtxPdfContent_ContentGenerator_New(pContent, FALSE); GOTO_CLEANUP_IF_NULL_PRINT_ERROR(pGenerator, _T("Failed to create content generator. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); } // Get area where group has to be int x = nPageCount % nNx; int y = nNy - (nPageCount / nNx) - 1; // Calculate cell size TPtxGeomReal_Size cellSize; cellSize.dWidth = (PageSize.dWidth - ((nNx + 1) * dBorder)) / nNx; cellSize.dHeight = (PageSize.dHeight - ((nNy + 1) * dBorder)) / nNy; // Calculate cell position TPtxGeomReal_Point cellPosition; cellPosition.dX = dBorder + x * (cellSize.dWidth + dBorder); cellPosition.dY = dBorder + y * (cellSize.dHeight + dBorder); // Copy page group from input to output pGroup = PtxPdfContent_Group_CopyFromPage(pOutDoc, pInPage, pCopyOptions); GOTO_CLEANUP_IF_NULL_PRINT_ERROR( pGroup, _T("Failed to copy page group from input to output. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); // Calculate group position TPtxGeomReal_Size groupSize; GOTO_CLEANUP_IF_FALSE_PRINT_ERROR(PtxPdfContent_Group_GetSize(pGroup, &groupSize), _T("%s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); double dScale = MIN(cellSize.dWidth / groupSize.dWidth, cellSize.dHeight / groupSize.dHeight); // Calculate target size TPtxGeomReal_Size targetSize; targetSize.dWidth = groupSize.dWidth * dScale; targetSize.dHeight = groupSize.dHeight * dScale; // Calculate position TPtxGeomReal_Point targetPos; targetPos.dX = cellPosition.dX + ((cellSize.dWidth - targetSize.dWidth) / 2); targetPos.dY = cellPosition.dY + ((cellSize.dHeight - targetSize.dHeight) / 2); // Calculate rectangle TPtxGeomReal_Rectangle targetRect; targetRect.dLeft = targetPos.dX; targetRect.dBottom = targetPos.dY; targetRect.dRight = targetPos.dX + targetSize.dWidth; targetRect.dTop = targetPos.dY + targetSize.dHeight; // Add group to page GOTO_CLEANUP_IF_FALSE_PRINT_ERROR( PtxPdfContent_ContentGenerator_PaintGroup(pGenerator, pGroup, &targetRect, NULL), _T("Failed to paint the group. %s (ErrorCode: 0x%08x).\n"), szErrorBuff, Ptx_GetLastError()); if (pGroup != NULL) { Ptx_Release(pGroup); pGroup = NULL; } if (pInPage != NULL) { Ptx_Release(pInPage); pInPage = NULL; } nPageCount++; } // Add partially filled page if (pOutPage != NULL) { PtxPdfContent_ContentGenerator_Close(pGenerator); 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()); Ptx_Release(pOutPage); pOutPage = NULL; }
int copyDocumentData(TPtxPdf_Document* pInDoc, TPtxPdf_Document* pOutDoc) { TPtxPdf_FileReferenceList* pInFileRefList; TPtxPdf_FileReferenceList* pOutFileRefList; // Output intent if (PtxPdf_Document_GetOutputIntent(pInDoc) != NULL) if (PtxPdf_Document_SetOutputIntent(pOutDoc, PtxPdfContent_IccBasedColorSpace_Copy( pOutDoc, PtxPdf_Document_GetOutputIntent(pInDoc))) == FALSE) return FALSE; // Metadata if (PtxPdf_Document_SetMetadata(pOutDoc, PtxPdf_Metadata_Copy(pOutDoc, PtxPdf_Document_GetMetadata(pInDoc))) == FALSE) return FALSE; // Viewer settings if (PtxPdf_Document_SetViewerSettings( pOutDoc, PtxPdfNav_ViewerSettings_Copy(pOutDoc, PtxPdf_Document_GetViewerSettings(pInDoc))) == FALSE) return FALSE; // Associated files (for PDF/A-3 and PDF 2.0 only) 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; // Plain embedded files 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; }
// Open input document 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); PageList outPages = outDoc.Pages; int pageCount = 0; ContentGenerator generator = null; Page outPage = null; // Copy document-wide data CopyDocumentData(inDoc, outDoc); // Copy all pages from input document foreach (Page inPage in inDoc.Pages) { if (pageCount == Nx * Ny) { // Add to output document generator.Dispose(); outPages.Add(outPage); outPage = null; pageCount = 0; } if (outPage == null) { // Create a new output page outPage = Page.Create(outDoc, PageSize); generator = new ContentGenerator(outPage.Content, false); } // Get area where group has to be int x = pageCount % Nx; int y = Ny - (pageCount / Nx) - 1; // Compute cell size Size cellSize = new Size { Width = (PageSize.Width - ((Nx + 1) * Border)) / Nx, Height = (PageSize.Height - ((Ny + 1) * Border)) / Ny }; // Compute cell position Point cellPosition = new Point { X = Border + x * (cellSize.Width + Border), Y = Border + y * (cellSize.Height + Border) }; // Define page copy options PageCopyOptions copyOptions = new PageCopyOptions(); // Copy page as group from input to output Group group = Group.CopyFromPage(outDoc, inPage, copyOptions); // Compute group position Size groupSize = group.Size; double scale = Math.Min(cellSize.Width / groupSize.Width, cellSize.Height / groupSize.Height); // Compute target size Size targetSize = new Size { Width = groupSize.Width * scale, Height = groupSize.Height * scale }; // Compute position Point targetPos = new Point { X = cellPosition.X + ((cellSize.Width - targetSize.Width) / 2), Y = cellPosition.Y + ((cellSize.Height - targetSize.Height) / 2) }; // Compute rectangle Rectangle targetRect = new Rectangle { Left = targetPos.X, Bottom = targetPos.Y, Right = targetPos.X + targetSize.Width, Top = targetPos.Y + targetSize.Height }; // Add group to page generator.PaintGroup(group, targetRect, null); pageCount++; } // Add page if (outPage != null) { generator.Dispose(); outPages.Add(outPage); } }
private static void CopyDocumentData(Document inDoc, Document outDoc) { // Copy document-wide data // Output intent if (inDoc.OutputIntent != null) outDoc.OutputIntent = IccBasedColorSpace.Copy(outDoc, inDoc.OutputIntent); // Metadata outDoc.Metadata = Metadata.Copy(outDoc, inDoc.Metadata); // Viewer settings outDoc.ViewerSettings = ViewerSettings.Copy(outDoc, inDoc.ViewerSettings); // Associated files (for PDF/A-3 and PDF 2.0 only) FileReferenceList outAssociatedFiles = outDoc.AssociatedFiles; foreach (FileReference inFileRef in inDoc.AssociatedFiles) outAssociatedFiles.Add(FileReference.Copy(outDoc, inFileRef)); // Plain embedded files FileReferenceList outEmbeddedFiles = outDoc.PlainEmbeddedFiles; foreach (FileReference inFileRef in inDoc.PlainEmbeddedFiles) outEmbeddedFiles.Add(FileReference.Copy(outDoc, inFileRef)); }
質問のページからお送りいただくようお願いします。
または、メールでsupport@trustss.co.jpあてにお送りください。
ご購入前の技術的質問も無償で対応します。サポート受付ページからお願いします。