Un foro de discusión para nuestra comunidad de hispano hablante

Moderator: amosbatto

#813940
Hola estoy trabajando con documentos de salida y el propósito es hacer un solo documento de varios documentos es decir el documento A tiene 3 paginas y el documento B tiene 2 paginas, yo deseo unir esos documentos en uno solo pero la información de los documentos no debe mezclar es decir que en el momento de generar el documento de salida el documento A no puede información del documento B, porque a la hora de imprimir el pdf generado este debe imprimir el documento A y el documento B sin que uno tenga información del otro hay alguna forma de controlar esto o debo generar los documentos de salida de manera independiente ?

otra opción es revisar como puedo unir los documentos que genere de manera indepeniente en uno solo docuemento pdf para el documento de salida
#813968
Puedes usar PMFGenerateOutputDocument() en un trigger o crear steps para generar los dos documents de PDF. Despues, puedes usar un trigger que utiliza convert, pdfunite, pdfjoin o gs para unir los documentos en un archivo nuevo. Ver:
https://stackoverflow.com/questions/250 ... to-one-pdf

Si estas usando un servidor de Windows, puedes instalar Poppler, que contiene el comando pdfunite:
https://sourceforge.net/projects/poppler-win32/

Ejemplo:
1. Crea un proceso con 2 Output Documents y un Input Document para contener el PDF unido. Copia los IDs de estos documentos para usarlos en el código de un trigger.

2. Crea un trigger con el siguiente código para generar los dos documentos de salida y unir los dos en uno y subir el archivo unido como un documento de entrada.

Aca es el código de un trigger que puedes usar como un ejemplo:
Code: Select all
$outDoc1Id = "5784874685ac7ea5febd611022221969"; //set to ID of Output Document 1
$outDoc2Id = "7324190235ac7ea78a4df60022265728"; //set to ID of Output Document 2
$joinedInpDocId = '1526387325ac7ea8dbdb153081079371'; //set to ID of Input Document
//set to name of MultipleFile field's ID and variable, which is the same in this example:
$joinedFileVariableName = 'clientInfoAndBillPdf'; 
//set to the name of the joined file:
$joinedFilename = preg_replace('/[^a-zA-Z0-9]/', '_', @@clientName) . '_InfoAndBill'; 

//not necessary to generate these if the Output Documents already exist in the case: 
PMFGenerateOutputDocument($outDoc1Id);
PMFGenerateOutputDocument($outDoc2Id);

//get the records of the generated Output Document files from the database:
$caseId = @@APPLICATION;
$sql1 = "SELECT * FROM APP_DOCUMENT WHERE APP_UID='$caseId' AND APP_DOC_STATUS='ACTIVE' 
   AND DOC_UID='$outDoc1Id' ORDER BY APP_DOC_INDEX DESC";
$sql2 = "SELECT * FROM APP_DOCUMENT WHERE APP_UID='$caseId' AND APP_DOC_STATUS='ACTIVE' 
  AND DOC_UID='$outDoc2Id' ORDER BY APP_DOC_INDEX DESC";

@=query1 = $aDoc1Result = executeQuery($sql1);
@=query2 = $aDoc2Result = executeQuery($sql2);

if (count($aDoc1Result) == 0 or count($aDoc2Result) == 0) {
   throw new Exception("Unable to find case's Output Documents files in the APP_DOCUMENTS table"); 
}

$g = new G();
@@path1 = $doc1Path = PATH_DOCUMENT. $g->getPathFromUID($caseId) .PATH_SEP. 'outdocs' .PATH_SEP. 
   $aDoc1Result[1]['APP_DOC_UID'] .'_'. $aDoc1Result[1]['DOC_VERSION'] .'.pdf';
@@path2 = $doc2Path = PATH_DOCUMENT. $g->getPathFromUID($caseId) .PATH_SEP. 'outdocs' .PATH_SEP. 
   $aDoc2Result[1]['APP_DOC_UID'] .'_'. $aDoc2Result[1]['DOC_VERSION'] .'.pdf';   

$joinedFilePath = tempnam(sys_get_temp_dir(), "joined_") . ".pdf";

//join the two PDFs in 1 file:
exec("pdfunite $doc1Path $doc2Path $joinedFilePath", @=aOutput);

//upload the joined PDF file as an Input Document to the current case:
$joinedFileId = PMFAddInputDocument($joinedInpDocId, null, 1, 'INPUT', '', 'Add',
   @@APPLICATION, @%INDEX, @@TASK, @@USER_LOGGED, 'file', $joinedFilePath);
   
//Delete the temporary joined PDF file from the server's file system:
unlink($joinedFilePath);

if (empty($joinedFileId)) {
   throw new Exception("Unable to upload joined file '$joinedFilePath' to case.");
} 

//if needing to display the joined PDF file in a MultipleFile field, 
//then set its variable in the case:
$aJoinedFile = array(array(
   'appDocUid' => $joinedFileId,
   'version'   => 1,
   'name'      => $joinedFilename .'.pdf'
));
PMFSendVariables($caseId, array($joinedFileVariableName => $aJoinedFile));

//Also need to associate the joined file with the MultipleFile field 
//by setting the field name of the MultipleFile in the file's record in
//APP_DOCUMENT.APP_DOC_FIELDNAME in the database. In this example, 
//assuming that the MultipleFile's ID and variable name are the same.
$oAppDoc = new AppDocument();
$aJoinedInfo = $oAppDoc->Load($joinedFileId, 1);

//Set to the ID of the MultipleFile field:
$aJoinedInfo['APP_DOC_FIELDNAME'] = $joinedFileVariableName; 
$aJoinedInfo['APP_DOC_FILENAME']  = $joinedFilename .'.pdf';

//save changes to the APP_DOCUMENT record in the database:
$oAppDoc->update($aJoinedInfo);
 
Si tienes un campo MultipleFile en un Dynaform o un paso de Input Document en tu proceso, puedes ver el PDF unido.

Si quieres probar este proceso, puedes descargarlo aca:
https://github.com/amosbatto/pmcommunit ... DFs_in_one

Hello everyone, A couple days ago I tried to displ[…]

Hello, i have next problem When you submit a for[…]

Unfortunately, the Dev team decided that allowin[…]

Hello everyone in previous versions of PM the ca[…]